diff --git a/.github/workflows/test-go.yml b/.github/workflows/test-go.yml
index 8ba6fcb5..225dbdf3 100644
--- a/.github/workflows/test-go.yml
+++ b/.github/workflows/test-go.yml
@@ -62,6 +62,20 @@ jobs:
with:
go-version: "1.14"
+ - name: Install Arduino Lint
+ run: |
+ ARDUINO_LINT_INSTALLATION_PATH="${{ runner.temp }}/arduino-lint"
+ mkdir --parents "$ARDUINO_LINT_INSTALLATION_PATH"
+ curl \
+ -fsSL \
+ https://raw.githubusercontent.com/arduino/arduino-lint/main/etc/install.sh \
+ | \
+ BINDIR="$ARDUINO_LINT_INSTALLATION_PATH" \
+ sh
+
+ # Add installation folder to path to path
+ echo "$ARDUINO_LINT_INSTALLATION_PATH" >> "$GITHUB_PATH"
+
- name: Install Taskfile
uses: arduino/actions/setup-taskfile@master
with:
diff --git a/libraries/lint.go b/libraries/lint.go
new file mode 100644
index 00000000..e9768425
--- /dev/null
+++ b/libraries/lint.go
@@ -0,0 +1,100 @@
+// This file is part of libraries-repository-engine.
+//
+// Copyright 2021 ARDUINO SA (http://www.arduino.cc/)
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published
+// by the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with this program. If not, see .
+//
+// You can be released from the requirements of the above licenses by purchasing
+// a commercial license. Buying such a license is mandatory if you want to
+// modify or otherwise use the software for commercial activities involving the
+// Arduino software without disclosing the source code of your own applications.
+// To purchase a commercial license, send an email to license@arduino.cc.
+
+package libraries
+
+import (
+ "encoding/json"
+ "fmt"
+ "io/ioutil"
+ "os"
+ "os/exec"
+ "path/filepath"
+)
+
+var empty struct{}
+
+var officialTypes = map[string]struct{}{
+ "Arduino": empty,
+}
+
+func official(metadata *Repo) bool {
+ for _, libraryType := range metadata.Types {
+ _, isOfficial := officialTypes[libraryType]
+ if isOfficial {
+ return true
+ }
+ }
+ return false
+}
+
+// RunArduinoLint runs Arduino Lint on the library and returns the report in the event of error or warnings.
+func RunArduinoLint(folder string, metadata *Repo) ([]byte, error) {
+ JSONReportFolder, err := ioutil.TempDir("", "arduino-lint-report-")
+ if err != nil {
+ panic(err)
+ }
+ JSONReportPath := filepath.Join(JSONReportFolder, "report.json")
+ defer os.RemoveAll(JSONReportPath)
+
+ // See: https://arduino.github.io/arduino-lint/latest/commands/arduino-lint/
+ cmd := exec.Command(
+ "arduino-lint",
+ "--compliance=permissive",
+ "--format=text",
+ "--project-type=library",
+ "--recursive=false",
+ "--report-file="+JSONReportPath,
+ folder,
+ )
+ // See: https://arduino.github.io/arduino-lint/latest/#environment-variables
+ cmd.Env = modifyEnv(os.Environ(), "ARDUINO_LINT_LIBRARY_MANAGER_INDEXING", "true")
+ cmd.Env = modifyEnv(cmd.Env, "ARDUINO_LINT_OFFICIAL", fmt.Sprintf("%t", official(metadata)))
+
+ textReport, lintErr := cmd.CombinedOutput()
+ if lintErr != nil {
+ return textReport, lintErr
+ }
+
+ // Read report.
+ rawJSONReport, err := ioutil.ReadFile(JSONReportPath)
+ if err != nil {
+ panic(err)
+ }
+ var JSONReport map[string]interface{}
+ if err := json.Unmarshal(rawJSONReport, &JSONReport); err != nil {
+ panic(err)
+ }
+
+ // Check warning count.
+ reportSummary := JSONReport["summary"].(map[string]interface{})
+ warningCount := reportSummary["warningCount"].(float64)
+
+ // Report should be displayed when there are warnings.
+ if warningCount > 0 {
+ return textReport, lintErr
+ }
+
+ // No warnings.
+ return nil, nil
+}
diff --git a/libraries/lint_test.go b/libraries/lint_test.go
new file mode 100644
index 00000000..fbb9a849
--- /dev/null
+++ b/libraries/lint_test.go
@@ -0,0 +1,108 @@
+// This file is part of libraries-repository-engine.
+//
+// Copyright 2021 ARDUINO SA (http://www.arduino.cc/)
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published
+// by the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with this program. If not, see .
+//
+// You can be released from the requirements of the above licenses by purchasing
+// a commercial license. Buying such a license is mandatory if you want to
+// modify or otherwise use the software for commercial activities involving the
+// Arduino software without disclosing the source code of your own applications.
+// To purchase a commercial license, send an email to license@arduino.cc.
+
+package libraries
+
+import (
+ "os"
+ "path/filepath"
+ "regexp"
+ "testing"
+
+ "github.com/stretchr/testify/assert"
+)
+
+var testDataPath string
+
+func init() {
+ workingDirectory, err := os.Getwd()
+ if err != nil {
+ panic(err)
+ }
+ testDataPath = filepath.Join(workingDirectory, "testdata")
+}
+
+func TestRunArduinoLint(t *testing.T) {
+ testTables := []struct {
+ testName string
+ folder string
+ official bool
+ reportRegexp string
+ errorAssertion assert.ErrorAssertionFunc
+ }{
+ {
+ "update",
+ "Arduino_MKRRGB",
+ true,
+ "^$",
+ assert.NoError,
+ },
+ {
+ "official",
+ "Arduino_TestOff",
+ true,
+ "^$",
+ assert.NoError,
+ },
+ {
+ "unofficial",
+ "Arduino_Test3rd",
+ false,
+ "LP012",
+ assert.NoError,
+ },
+ {
+ "error",
+ "Arduino_TestErr",
+ true,
+ "LS006",
+ assert.Error,
+ },
+ {
+ "warning",
+ "Arduino_TestWarn",
+ true,
+ "LP015",
+ assert.NoError,
+ },
+ {
+ "pass",
+ "Arduino_TestPass",
+ true,
+ "^$",
+ assert.NoError,
+ },
+ }
+
+ for _, testTable := range testTables {
+ var metadata Repo
+ if testTable.official {
+ metadata.Types = []string{"Arduino"}
+ } else {
+ metadata.Types = []string{"Contributed"}
+ }
+ report, err := RunArduinoLint(filepath.Join(testDataPath, "libraries", testTable.folder), &metadata)
+ assert.Regexp(t, regexp.MustCompile(testTable.reportRegexp), string(report), testTable.testName)
+ testTable.errorAssertion(t, err, testTable.testName)
+ }
+}
diff --git a/libraries/metadata/metadata.go b/libraries/metadata/metadata.go
index 3733da17..c1000822 100644
--- a/libraries/metadata/metadata.go
+++ b/libraries/metadata/metadata.go
@@ -40,8 +40,6 @@ import (
"context"
"encoding/base64"
"errors"
- "regexp"
- "strings"
"github.com/google/go-github/github"
ini "github.com/vaughan0/go-ini"
@@ -64,109 +62,6 @@ type LibraryMetadata struct {
Depends string
}
-const categoryUcategorized string = "Uncategorized"
-
-var validCategories = []string{
- "Display",
- "Communication",
- "Signal Input/Output",
- "Sensors",
- "Device Control",
- "Timing",
- "Data Storage",
- "Data Processing",
- "Other",
- categoryUcategorized,
-}
-
-// IsValidCategory checks if category is a valid category
-func IsValidCategory(category string) bool {
- for _, c := range validCategories {
- if category == c {
- return true
- }
- }
- return false
-}
-
-// Validate checks LibraryMetadata for errors, returns an array of the errors found
-func (library *LibraryMetadata) Validate() []error {
- var errorsAccumulator []error
-
- // Check lib name
- if !IsValidLibraryName(library.Name) {
- errorsAccumulator = append(errorsAccumulator, errors.New("Invalid 'name' field: "+library.Name))
- }
-
- // Check author and maintainer existence
- if library.Author == "" {
- errorsAccumulator = append(errorsAccumulator, errors.New("'author' field must be defined"))
- }
- if library.Maintainer == "" {
- library.Maintainer = library.Author
- }
-
- // Check sentence and paragraph and url existence
- if library.Sentence == "" || library.URL == "" {
- errorsAccumulator = append(errorsAccumulator, errors.New("'sentence' and 'url' fields must be defined"))
- }
-
- newVersion, err := VersionToSemverCompliant(library.Version)
- if err != nil {
- errorsAccumulator = append(errorsAccumulator, err)
- }
- library.Version = newVersion
-
- // Check if the category is valid and set to "Uncategorized" if not
- if !IsValidCategory(library.Category) {
- library.Category = categoryUcategorized
- }
-
- // Check if 'depends' field is correctly written
- if !IsValidDependency(library.Depends) {
- errorsAccumulator = append(errorsAccumulator, errors.New("Invalid 'depends' field: "+library.Depends))
- }
- return errorsAccumulator
-}
-
-// IsValidLibraryName checks if a string is a valid library name
-func IsValidLibraryName(name string) bool {
- if len(name) == 0 {
- return false
- }
- if name[0] == '-' || name[0] == '_' || name[0] == ' ' {
- return false
- }
- for _, char := range name {
- if !strings.Contains("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-. ", string(char)) {
- return false
- }
- }
- return true
-}
-
-var re = regexp.MustCompile("^([a-zA-Z0-9](?:[a-zA-Z0-9._\\- ]*[a-zA-Z0-9])?) *(?: \\(([^()]*)\\))?$")
-
-// IsValidDependency checks if the `depends` field of library.properties is correctly formatted
-func IsValidDependency(depends string) bool {
- // TODO: merge this method with db.ExtractDependenciesList
- depends = strings.TrimSpace(depends)
- if depends == "" {
- return true
- }
- for _, dep := range strings.Split(depends, ",") {
- dep = strings.TrimSpace(dep)
- if dep == "" {
- return false
- }
- matches := re.FindAllStringSubmatch(dep, -1)
- if matches == nil {
- return false
- }
- }
- return true
-}
-
// ParsePullRequest makes a LibraryMetadata by reading library.properties from a github.PullRequest
func ParsePullRequest(gh *github.Client, pull *github.PullRequest) (*LibraryMetadata, error) {
head := *pull.Head
diff --git a/libraries/metadata/metadata_test.go b/libraries/metadata/metadata_test.go
deleted file mode 100644
index 63357fcd..00000000
--- a/libraries/metadata/metadata_test.go
+++ /dev/null
@@ -1,45 +0,0 @@
-// This file is part of libraries-repository-engine.
-//
-// Copyright 2021 ARDUINO SA (http://www.arduino.cc/)
-//
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU Affero General Public License as published
-// by the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU Affero General Public License for more details.
-//
-// You should have received a copy of the GNU Affero General Public License
-// along with this program. If not, see .
-//
-// You can be released from the requirements of the above licenses by purchasing
-// a commercial license. Buying such a license is mandatory if you want to
-// modify or otherwise use the software for commercial activities involving the
-// Arduino software without disclosing the source code of your own applications.
-// To purchase a commercial license, send an email to license@arduino.cc.
-
-package metadata
-
-import (
- "testing"
-
- "github.com/stretchr/testify/require"
-)
-
-func TestMetadataChecks(t *testing.T) {
- require.True(t, IsValidLibraryName("asjdh qweqwe - qweqwe_213123"))
- require.False(t, IsValidLibraryName("-asdasda"))
- require.False(t, IsValidLibraryName("_"))
- require.False(t, IsValidLibraryName(" asdasd"))
- require.False(t, IsValidLibraryName("asd$"))
-
- require.True(t, IsValidDependency("asdas"))
- require.True(t, IsValidDependency("asdas asdadasd,123213"))
- require.False(t, IsValidDependency("asdas asdadasd,,123213"))
- require.True(t, IsValidDependency(""))
- require.False(t, IsValidDependency("_123123,asdasd"))
- require.False(t, IsValidDependency("435regf,asdkwjqwe,_ger,213123"))
-}
diff --git a/libraries/repoclone.go b/libraries/repoclone.go
index c07d8cab..b0801069 100644
--- a/libraries/repoclone.go
+++ b/libraries/repoclone.go
@@ -24,7 +24,6 @@
package libraries
import (
- "errors"
"io/ioutil"
"os"
"path/filepath"
@@ -100,16 +99,6 @@ func GenerateLibraryFromRepo(repo *Repository) (*metadata.LibraryMetadata, error
return nil, err
}
- libraryErrors := library.Validate()
- if len(libraryErrors) > 0 {
- var errorsString []string
- for _, error := range libraryErrors {
- errorsString = append(errorsString, error.Error())
- }
- combinedErrors := strings.Join(errorsString, ",")
- return nil, errors.New(combinedErrors)
- }
-
return library, nil
}
diff --git a/libraries/testdata/libraries/Arduino_MKRRGB/LICENSE.txt b/libraries/testdata/libraries/Arduino_MKRRGB/LICENSE.txt
new file mode 100644
index 00000000..0e259d42
--- /dev/null
+++ b/libraries/testdata/libraries/Arduino_MKRRGB/LICENSE.txt
@@ -0,0 +1,121 @@
+Creative Commons Legal Code
+
+CC0 1.0 Universal
+
+ CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
+ LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN
+ ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
+ INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
+ REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS
+ PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
+ THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED
+ HEREUNDER.
+
+Statement of Purpose
+
+The laws of most jurisdictions throughout the world automatically confer
+exclusive Copyright and Related Rights (defined below) upon the creator
+and subsequent owner(s) (each and all, an "owner") of an original work of
+authorship and/or a database (each, a "Work").
+
+Certain owners wish to permanently relinquish those rights to a Work for
+the purpose of contributing to a commons of creative, cultural and
+scientific works ("Commons") that the public can reliably and without fear
+of later claims of infringement build upon, modify, incorporate in other
+works, reuse and redistribute as freely as possible in any form whatsoever
+and for any purposes, including without limitation commercial purposes.
+These owners may contribute to the Commons to promote the ideal of a free
+culture and the further production of creative, cultural and scientific
+works, or to gain reputation or greater distribution for their Work in
+part through the use and efforts of others.
+
+For these and/or other purposes and motivations, and without any
+expectation of additional consideration or compensation, the person
+associating CC0 with a Work (the "Affirmer"), to the extent that he or she
+is an owner of Copyright and Related Rights in the Work, voluntarily
+elects to apply CC0 to the Work and publicly distribute the Work under its
+terms, with knowledge of his or her Copyright and Related Rights in the
+Work and the meaning and intended legal effect of CC0 on those rights.
+
+1. Copyright and Related Rights. A Work made available under CC0 may be
+protected by copyright and related or neighboring rights ("Copyright and
+Related Rights"). Copyright and Related Rights include, but are not
+limited to, the following:
+
+ i. the right to reproduce, adapt, distribute, perform, display,
+ communicate, and translate a Work;
+ ii. moral rights retained by the original author(s) and/or performer(s);
+iii. publicity and privacy rights pertaining to a person's image or
+ likeness depicted in a Work;
+ iv. rights protecting against unfair competition in regards to a Work,
+ subject to the limitations in paragraph 4(a), below;
+ v. rights protecting the extraction, dissemination, use and reuse of data
+ in a Work;
+ vi. database rights (such as those arising under Directive 96/9/EC of the
+ European Parliament and of the Council of 11 March 1996 on the legal
+ protection of databases, and under any national implementation
+ thereof, including any amended or successor version of such
+ directive); and
+vii. other similar, equivalent or corresponding rights throughout the
+ world based on applicable law or treaty, and any national
+ implementations thereof.
+
+2. Waiver. To the greatest extent permitted by, but not in contravention
+of, applicable law, Affirmer hereby overtly, fully, permanently,
+irrevocably and unconditionally waives, abandons, and surrenders all of
+Affirmer's Copyright and Related Rights and associated claims and causes
+of action, whether now known or unknown (including existing as well as
+future claims and causes of action), in the Work (i) in all territories
+worldwide, (ii) for the maximum duration provided by applicable law or
+treaty (including future time extensions), (iii) in any current or future
+medium and for any number of copies, and (iv) for any purpose whatsoever,
+including without limitation commercial, advertising or promotional
+purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each
+member of the public at large and to the detriment of Affirmer's heirs and
+successors, fully intending that such Waiver shall not be subject to
+revocation, rescission, cancellation, termination, or any other legal or
+equitable action to disrupt the quiet enjoyment of the Work by the public
+as contemplated by Affirmer's express Statement of Purpose.
+
+3. Public License Fallback. Should any part of the Waiver for any reason
+be judged legally invalid or ineffective under applicable law, then the
+Waiver shall be preserved to the maximum extent permitted taking into
+account Affirmer's express Statement of Purpose. In addition, to the
+extent the Waiver is so judged Affirmer hereby grants to each affected
+person a royalty-free, non transferable, non sublicensable, non exclusive,
+irrevocable and unconditional license to exercise Affirmer's Copyright and
+Related Rights in the Work (i) in all territories worldwide, (ii) for the
+maximum duration provided by applicable law or treaty (including future
+time extensions), (iii) in any current or future medium and for any number
+of copies, and (iv) for any purpose whatsoever, including without
+limitation commercial, advertising or promotional purposes (the
+"License"). The License shall be deemed effective as of the date CC0 was
+applied by Affirmer to the Work. Should any part of the License for any
+reason be judged legally invalid or ineffective under applicable law, such
+partial invalidity or ineffectiveness shall not invalidate the remainder
+of the License, and in such case Affirmer hereby affirms that he or she
+will not (i) exercise any of his or her remaining Copyright and Related
+Rights in the Work or (ii) assert any associated claims and causes of
+action with respect to the Work, in either case contrary to Affirmer's
+express Statement of Purpose.
+
+4. Limitations and Disclaimers.
+
+ a. No trademark or patent rights held by Affirmer are waived, abandoned,
+ surrendered, licensed or otherwise affected by this document.
+ b. Affirmer offers the Work as-is and makes no representations or
+ warranties of any kind concerning the Work, express, implied,
+ statutory or otherwise, including without limitation warranties of
+ title, merchantability, fitness for a particular purpose, non
+ infringement, or the absence of latent or other defects, accuracy, or
+ the present or absence of errors, whether or not discoverable, all to
+ the greatest extent permissible under applicable law.
+ c. Affirmer disclaims responsibility for clearing rights of other persons
+ that may apply to the Work or any use thereof, including without
+ limitation any person's Copyright and Related Rights in the Work.
+ Further, Affirmer disclaims responsibility for obtaining any necessary
+ consents, permissions or other rights required for any use of the
+ Work.
+ d. Affirmer understands and acknowledges that Creative Commons is not a
+ party to this document and has no duty or obligation with respect to
+ this CC0 or use of the Work.
diff --git a/libraries/testdata/libraries/Arduino_MKRRGB/README.md b/libraries/testdata/libraries/Arduino_MKRRGB/README.md
new file mode 100644
index 00000000..e69de29b
diff --git a/libraries/testdata/libraries/Arduino_MKRRGB/examples/Example/Example.ino b/libraries/testdata/libraries/Arduino_MKRRGB/examples/Example/Example.ino
new file mode 100644
index 00000000..660bdbcc
--- /dev/null
+++ b/libraries/testdata/libraries/Arduino_MKRRGB/examples/Example/Example.ino
@@ -0,0 +1,2 @@
+void setup() {}
+void loop() {}
diff --git a/libraries/testdata/libraries/Arduino_MKRRGB/library.properties b/libraries/testdata/libraries/Arduino_MKRRGB/library.properties
new file mode 100644
index 00000000..b5ed5795
--- /dev/null
+++ b/libraries/testdata/libraries/Arduino_MKRRGB/library.properties
@@ -0,0 +1,9 @@
+name=Arduino_MKRRGB
+version=1.0.0
+author=Cristian Maglie , Pippo Pluto
+maintainer=Cristian Maglie
+sentence=A library that makes coding a Webserver a breeze.
+paragraph=Supports HTTP1.1 and you can do GET and POST.
+category=Communication
+url=http://example.com/
+architectures=avr
diff --git a/libraries/testdata/libraries/Arduino_MKRRGB/src/Arduino_MKRRGB.h b/libraries/testdata/libraries/Arduino_MKRRGB/src/Arduino_MKRRGB.h
new file mode 100644
index 00000000..e69de29b
diff --git a/libraries/testdata/libraries/Arduino_Test3rd/LICENSE.txt b/libraries/testdata/libraries/Arduino_Test3rd/LICENSE.txt
new file mode 100644
index 00000000..0e259d42
--- /dev/null
+++ b/libraries/testdata/libraries/Arduino_Test3rd/LICENSE.txt
@@ -0,0 +1,121 @@
+Creative Commons Legal Code
+
+CC0 1.0 Universal
+
+ CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
+ LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN
+ ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
+ INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
+ REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS
+ PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
+ THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED
+ HEREUNDER.
+
+Statement of Purpose
+
+The laws of most jurisdictions throughout the world automatically confer
+exclusive Copyright and Related Rights (defined below) upon the creator
+and subsequent owner(s) (each and all, an "owner") of an original work of
+authorship and/or a database (each, a "Work").
+
+Certain owners wish to permanently relinquish those rights to a Work for
+the purpose of contributing to a commons of creative, cultural and
+scientific works ("Commons") that the public can reliably and without fear
+of later claims of infringement build upon, modify, incorporate in other
+works, reuse and redistribute as freely as possible in any form whatsoever
+and for any purposes, including without limitation commercial purposes.
+These owners may contribute to the Commons to promote the ideal of a free
+culture and the further production of creative, cultural and scientific
+works, or to gain reputation or greater distribution for their Work in
+part through the use and efforts of others.
+
+For these and/or other purposes and motivations, and without any
+expectation of additional consideration or compensation, the person
+associating CC0 with a Work (the "Affirmer"), to the extent that he or she
+is an owner of Copyright and Related Rights in the Work, voluntarily
+elects to apply CC0 to the Work and publicly distribute the Work under its
+terms, with knowledge of his or her Copyright and Related Rights in the
+Work and the meaning and intended legal effect of CC0 on those rights.
+
+1. Copyright and Related Rights. A Work made available under CC0 may be
+protected by copyright and related or neighboring rights ("Copyright and
+Related Rights"). Copyright and Related Rights include, but are not
+limited to, the following:
+
+ i. the right to reproduce, adapt, distribute, perform, display,
+ communicate, and translate a Work;
+ ii. moral rights retained by the original author(s) and/or performer(s);
+iii. publicity and privacy rights pertaining to a person's image or
+ likeness depicted in a Work;
+ iv. rights protecting against unfair competition in regards to a Work,
+ subject to the limitations in paragraph 4(a), below;
+ v. rights protecting the extraction, dissemination, use and reuse of data
+ in a Work;
+ vi. database rights (such as those arising under Directive 96/9/EC of the
+ European Parliament and of the Council of 11 March 1996 on the legal
+ protection of databases, and under any national implementation
+ thereof, including any amended or successor version of such
+ directive); and
+vii. other similar, equivalent or corresponding rights throughout the
+ world based on applicable law or treaty, and any national
+ implementations thereof.
+
+2. Waiver. To the greatest extent permitted by, but not in contravention
+of, applicable law, Affirmer hereby overtly, fully, permanently,
+irrevocably and unconditionally waives, abandons, and surrenders all of
+Affirmer's Copyright and Related Rights and associated claims and causes
+of action, whether now known or unknown (including existing as well as
+future claims and causes of action), in the Work (i) in all territories
+worldwide, (ii) for the maximum duration provided by applicable law or
+treaty (including future time extensions), (iii) in any current or future
+medium and for any number of copies, and (iv) for any purpose whatsoever,
+including without limitation commercial, advertising or promotional
+purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each
+member of the public at large and to the detriment of Affirmer's heirs and
+successors, fully intending that such Waiver shall not be subject to
+revocation, rescission, cancellation, termination, or any other legal or
+equitable action to disrupt the quiet enjoyment of the Work by the public
+as contemplated by Affirmer's express Statement of Purpose.
+
+3. Public License Fallback. Should any part of the Waiver for any reason
+be judged legally invalid or ineffective under applicable law, then the
+Waiver shall be preserved to the maximum extent permitted taking into
+account Affirmer's express Statement of Purpose. In addition, to the
+extent the Waiver is so judged Affirmer hereby grants to each affected
+person a royalty-free, non transferable, non sublicensable, non exclusive,
+irrevocable and unconditional license to exercise Affirmer's Copyright and
+Related Rights in the Work (i) in all territories worldwide, (ii) for the
+maximum duration provided by applicable law or treaty (including future
+time extensions), (iii) in any current or future medium and for any number
+of copies, and (iv) for any purpose whatsoever, including without
+limitation commercial, advertising or promotional purposes (the
+"License"). The License shall be deemed effective as of the date CC0 was
+applied by Affirmer to the Work. Should any part of the License for any
+reason be judged legally invalid or ineffective under applicable law, such
+partial invalidity or ineffectiveness shall not invalidate the remainder
+of the License, and in such case Affirmer hereby affirms that he or she
+will not (i) exercise any of his or her remaining Copyright and Related
+Rights in the Work or (ii) assert any associated claims and causes of
+action with respect to the Work, in either case contrary to Affirmer's
+express Statement of Purpose.
+
+4. Limitations and Disclaimers.
+
+ a. No trademark or patent rights held by Affirmer are waived, abandoned,
+ surrendered, licensed or otherwise affected by this document.
+ b. Affirmer offers the Work as-is and makes no representations or
+ warranties of any kind concerning the Work, express, implied,
+ statutory or otherwise, including without limitation warranties of
+ title, merchantability, fitness for a particular purpose, non
+ infringement, or the absence of latent or other defects, accuracy, or
+ the present or absence of errors, whether or not discoverable, all to
+ the greatest extent permissible under applicable law.
+ c. Affirmer disclaims responsibility for clearing rights of other persons
+ that may apply to the Work or any use thereof, including without
+ limitation any person's Copyright and Related Rights in the Work.
+ Further, Affirmer disclaims responsibility for obtaining any necessary
+ consents, permissions or other rights required for any use of the
+ Work.
+ d. Affirmer understands and acknowledges that Creative Commons is not a
+ party to this document and has no duty or obligation with respect to
+ this CC0 or use of the Work.
diff --git a/libraries/testdata/libraries/Arduino_Test3rd/README.md b/libraries/testdata/libraries/Arduino_Test3rd/README.md
new file mode 100644
index 00000000..e69de29b
diff --git a/libraries/testdata/libraries/Arduino_Test3rd/examples/Example/Example.ino b/libraries/testdata/libraries/Arduino_Test3rd/examples/Example/Example.ino
new file mode 100644
index 00000000..660bdbcc
--- /dev/null
+++ b/libraries/testdata/libraries/Arduino_Test3rd/examples/Example/Example.ino
@@ -0,0 +1,2 @@
+void setup() {}
+void loop() {}
diff --git a/libraries/testdata/libraries/Arduino_Test3rd/library.properties b/libraries/testdata/libraries/Arduino_Test3rd/library.properties
new file mode 100644
index 00000000..046afe12
--- /dev/null
+++ b/libraries/testdata/libraries/Arduino_Test3rd/library.properties
@@ -0,0 +1,9 @@
+name=Arduino_Test3rd
+version=1.0.0
+author=Cristian Maglie , Pippo Pluto
+maintainer=Cristian Maglie
+sentence=A library that makes coding a Webserver a breeze.
+paragraph=Supports HTTP1.1 and you can do GET and POST.
+category=Communication
+url=http://example.com/
+architectures=avr
diff --git a/libraries/testdata/libraries/Arduino_Test3rd/src/Arduino_Test3rd.h b/libraries/testdata/libraries/Arduino_Test3rd/src/Arduino_Test3rd.h
new file mode 100644
index 00000000..e69de29b
diff --git a/libraries/testdata/libraries/Arduino_TestErr/.development b/libraries/testdata/libraries/Arduino_TestErr/.development
new file mode 100644
index 00000000..67f5bf99
--- /dev/null
+++ b/libraries/testdata/libraries/Arduino_TestErr/.development
@@ -0,0 +1 @@
+This file added to violate Arduino Lint rule LS006
diff --git a/libraries/testdata/libraries/Arduino_TestErr/LICENSE.txt b/libraries/testdata/libraries/Arduino_TestErr/LICENSE.txt
new file mode 100644
index 00000000..0e259d42
--- /dev/null
+++ b/libraries/testdata/libraries/Arduino_TestErr/LICENSE.txt
@@ -0,0 +1,121 @@
+Creative Commons Legal Code
+
+CC0 1.0 Universal
+
+ CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
+ LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN
+ ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
+ INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
+ REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS
+ PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
+ THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED
+ HEREUNDER.
+
+Statement of Purpose
+
+The laws of most jurisdictions throughout the world automatically confer
+exclusive Copyright and Related Rights (defined below) upon the creator
+and subsequent owner(s) (each and all, an "owner") of an original work of
+authorship and/or a database (each, a "Work").
+
+Certain owners wish to permanently relinquish those rights to a Work for
+the purpose of contributing to a commons of creative, cultural and
+scientific works ("Commons") that the public can reliably and without fear
+of later claims of infringement build upon, modify, incorporate in other
+works, reuse and redistribute as freely as possible in any form whatsoever
+and for any purposes, including without limitation commercial purposes.
+These owners may contribute to the Commons to promote the ideal of a free
+culture and the further production of creative, cultural and scientific
+works, or to gain reputation or greater distribution for their Work in
+part through the use and efforts of others.
+
+For these and/or other purposes and motivations, and without any
+expectation of additional consideration or compensation, the person
+associating CC0 with a Work (the "Affirmer"), to the extent that he or she
+is an owner of Copyright and Related Rights in the Work, voluntarily
+elects to apply CC0 to the Work and publicly distribute the Work under its
+terms, with knowledge of his or her Copyright and Related Rights in the
+Work and the meaning and intended legal effect of CC0 on those rights.
+
+1. Copyright and Related Rights. A Work made available under CC0 may be
+protected by copyright and related or neighboring rights ("Copyright and
+Related Rights"). Copyright and Related Rights include, but are not
+limited to, the following:
+
+ i. the right to reproduce, adapt, distribute, perform, display,
+ communicate, and translate a Work;
+ ii. moral rights retained by the original author(s) and/or performer(s);
+iii. publicity and privacy rights pertaining to a person's image or
+ likeness depicted in a Work;
+ iv. rights protecting against unfair competition in regards to a Work,
+ subject to the limitations in paragraph 4(a), below;
+ v. rights protecting the extraction, dissemination, use and reuse of data
+ in a Work;
+ vi. database rights (such as those arising under Directive 96/9/EC of the
+ European Parliament and of the Council of 11 March 1996 on the legal
+ protection of databases, and under any national implementation
+ thereof, including any amended or successor version of such
+ directive); and
+vii. other similar, equivalent or corresponding rights throughout the
+ world based on applicable law or treaty, and any national
+ implementations thereof.
+
+2. Waiver. To the greatest extent permitted by, but not in contravention
+of, applicable law, Affirmer hereby overtly, fully, permanently,
+irrevocably and unconditionally waives, abandons, and surrenders all of
+Affirmer's Copyright and Related Rights and associated claims and causes
+of action, whether now known or unknown (including existing as well as
+future claims and causes of action), in the Work (i) in all territories
+worldwide, (ii) for the maximum duration provided by applicable law or
+treaty (including future time extensions), (iii) in any current or future
+medium and for any number of copies, and (iv) for any purpose whatsoever,
+including without limitation commercial, advertising or promotional
+purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each
+member of the public at large and to the detriment of Affirmer's heirs and
+successors, fully intending that such Waiver shall not be subject to
+revocation, rescission, cancellation, termination, or any other legal or
+equitable action to disrupt the quiet enjoyment of the Work by the public
+as contemplated by Affirmer's express Statement of Purpose.
+
+3. Public License Fallback. Should any part of the Waiver for any reason
+be judged legally invalid or ineffective under applicable law, then the
+Waiver shall be preserved to the maximum extent permitted taking into
+account Affirmer's express Statement of Purpose. In addition, to the
+extent the Waiver is so judged Affirmer hereby grants to each affected
+person a royalty-free, non transferable, non sublicensable, non exclusive,
+irrevocable and unconditional license to exercise Affirmer's Copyright and
+Related Rights in the Work (i) in all territories worldwide, (ii) for the
+maximum duration provided by applicable law or treaty (including future
+time extensions), (iii) in any current or future medium and for any number
+of copies, and (iv) for any purpose whatsoever, including without
+limitation commercial, advertising or promotional purposes (the
+"License"). The License shall be deemed effective as of the date CC0 was
+applied by Affirmer to the Work. Should any part of the License for any
+reason be judged legally invalid or ineffective under applicable law, such
+partial invalidity or ineffectiveness shall not invalidate the remainder
+of the License, and in such case Affirmer hereby affirms that he or she
+will not (i) exercise any of his or her remaining Copyright and Related
+Rights in the Work or (ii) assert any associated claims and causes of
+action with respect to the Work, in either case contrary to Affirmer's
+express Statement of Purpose.
+
+4. Limitations and Disclaimers.
+
+ a. No trademark or patent rights held by Affirmer are waived, abandoned,
+ surrendered, licensed or otherwise affected by this document.
+ b. Affirmer offers the Work as-is and makes no representations or
+ warranties of any kind concerning the Work, express, implied,
+ statutory or otherwise, including without limitation warranties of
+ title, merchantability, fitness for a particular purpose, non
+ infringement, or the absence of latent or other defects, accuracy, or
+ the present or absence of errors, whether or not discoverable, all to
+ the greatest extent permissible under applicable law.
+ c. Affirmer disclaims responsibility for clearing rights of other persons
+ that may apply to the Work or any use thereof, including without
+ limitation any person's Copyright and Related Rights in the Work.
+ Further, Affirmer disclaims responsibility for obtaining any necessary
+ consents, permissions or other rights required for any use of the
+ Work.
+ d. Affirmer understands and acknowledges that Creative Commons is not a
+ party to this document and has no duty or obligation with respect to
+ this CC0 or use of the Work.
diff --git a/libraries/testdata/libraries/Arduino_TestErr/README.md b/libraries/testdata/libraries/Arduino_TestErr/README.md
new file mode 100644
index 00000000..e69de29b
diff --git a/libraries/testdata/libraries/Arduino_TestErr/examples/Example/Example.ino b/libraries/testdata/libraries/Arduino_TestErr/examples/Example/Example.ino
new file mode 100644
index 00000000..660bdbcc
--- /dev/null
+++ b/libraries/testdata/libraries/Arduino_TestErr/examples/Example/Example.ino
@@ -0,0 +1,2 @@
+void setup() {}
+void loop() {}
diff --git a/libraries/testdata/libraries/Arduino_TestErr/library.properties b/libraries/testdata/libraries/Arduino_TestErr/library.properties
new file mode 100644
index 00000000..03c98c19
--- /dev/null
+++ b/libraries/testdata/libraries/Arduino_TestErr/library.properties
@@ -0,0 +1,9 @@
+name=Arduino_TestErr
+version=1.0.0
+author=Cristian Maglie , Pippo Pluto
+maintainer=Cristian Maglie
+sentence=A library that makes coding a Webserver a breeze.
+paragraph=Supports HTTP1.1 and you can do GET and POST.
+category=Communication
+url=http://example.com/
+architectures=avr
diff --git a/libraries/testdata/libraries/Arduino_TestErr/src/Arduino_TestErr.h b/libraries/testdata/libraries/Arduino_TestErr/src/Arduino_TestErr.h
new file mode 100644
index 00000000..e69de29b
diff --git a/libraries/testdata/libraries/Arduino_TestOff/LICENSE.txt b/libraries/testdata/libraries/Arduino_TestOff/LICENSE.txt
new file mode 100644
index 00000000..0e259d42
--- /dev/null
+++ b/libraries/testdata/libraries/Arduino_TestOff/LICENSE.txt
@@ -0,0 +1,121 @@
+Creative Commons Legal Code
+
+CC0 1.0 Universal
+
+ CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
+ LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN
+ ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
+ INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
+ REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS
+ PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
+ THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED
+ HEREUNDER.
+
+Statement of Purpose
+
+The laws of most jurisdictions throughout the world automatically confer
+exclusive Copyright and Related Rights (defined below) upon the creator
+and subsequent owner(s) (each and all, an "owner") of an original work of
+authorship and/or a database (each, a "Work").
+
+Certain owners wish to permanently relinquish those rights to a Work for
+the purpose of contributing to a commons of creative, cultural and
+scientific works ("Commons") that the public can reliably and without fear
+of later claims of infringement build upon, modify, incorporate in other
+works, reuse and redistribute as freely as possible in any form whatsoever
+and for any purposes, including without limitation commercial purposes.
+These owners may contribute to the Commons to promote the ideal of a free
+culture and the further production of creative, cultural and scientific
+works, or to gain reputation or greater distribution for their Work in
+part through the use and efforts of others.
+
+For these and/or other purposes and motivations, and without any
+expectation of additional consideration or compensation, the person
+associating CC0 with a Work (the "Affirmer"), to the extent that he or she
+is an owner of Copyright and Related Rights in the Work, voluntarily
+elects to apply CC0 to the Work and publicly distribute the Work under its
+terms, with knowledge of his or her Copyright and Related Rights in the
+Work and the meaning and intended legal effect of CC0 on those rights.
+
+1. Copyright and Related Rights. A Work made available under CC0 may be
+protected by copyright and related or neighboring rights ("Copyright and
+Related Rights"). Copyright and Related Rights include, but are not
+limited to, the following:
+
+ i. the right to reproduce, adapt, distribute, perform, display,
+ communicate, and translate a Work;
+ ii. moral rights retained by the original author(s) and/or performer(s);
+iii. publicity and privacy rights pertaining to a person's image or
+ likeness depicted in a Work;
+ iv. rights protecting against unfair competition in regards to a Work,
+ subject to the limitations in paragraph 4(a), below;
+ v. rights protecting the extraction, dissemination, use and reuse of data
+ in a Work;
+ vi. database rights (such as those arising under Directive 96/9/EC of the
+ European Parliament and of the Council of 11 March 1996 on the legal
+ protection of databases, and under any national implementation
+ thereof, including any amended or successor version of such
+ directive); and
+vii. other similar, equivalent or corresponding rights throughout the
+ world based on applicable law or treaty, and any national
+ implementations thereof.
+
+2. Waiver. To the greatest extent permitted by, but not in contravention
+of, applicable law, Affirmer hereby overtly, fully, permanently,
+irrevocably and unconditionally waives, abandons, and surrenders all of
+Affirmer's Copyright and Related Rights and associated claims and causes
+of action, whether now known or unknown (including existing as well as
+future claims and causes of action), in the Work (i) in all territories
+worldwide, (ii) for the maximum duration provided by applicable law or
+treaty (including future time extensions), (iii) in any current or future
+medium and for any number of copies, and (iv) for any purpose whatsoever,
+including without limitation commercial, advertising or promotional
+purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each
+member of the public at large and to the detriment of Affirmer's heirs and
+successors, fully intending that such Waiver shall not be subject to
+revocation, rescission, cancellation, termination, or any other legal or
+equitable action to disrupt the quiet enjoyment of the Work by the public
+as contemplated by Affirmer's express Statement of Purpose.
+
+3. Public License Fallback. Should any part of the Waiver for any reason
+be judged legally invalid or ineffective under applicable law, then the
+Waiver shall be preserved to the maximum extent permitted taking into
+account Affirmer's express Statement of Purpose. In addition, to the
+extent the Waiver is so judged Affirmer hereby grants to each affected
+person a royalty-free, non transferable, non sublicensable, non exclusive,
+irrevocable and unconditional license to exercise Affirmer's Copyright and
+Related Rights in the Work (i) in all territories worldwide, (ii) for the
+maximum duration provided by applicable law or treaty (including future
+time extensions), (iii) in any current or future medium and for any number
+of copies, and (iv) for any purpose whatsoever, including without
+limitation commercial, advertising or promotional purposes (the
+"License"). The License shall be deemed effective as of the date CC0 was
+applied by Affirmer to the Work. Should any part of the License for any
+reason be judged legally invalid or ineffective under applicable law, such
+partial invalidity or ineffectiveness shall not invalidate the remainder
+of the License, and in such case Affirmer hereby affirms that he or she
+will not (i) exercise any of his or her remaining Copyright and Related
+Rights in the Work or (ii) assert any associated claims and causes of
+action with respect to the Work, in either case contrary to Affirmer's
+express Statement of Purpose.
+
+4. Limitations and Disclaimers.
+
+ a. No trademark or patent rights held by Affirmer are waived, abandoned,
+ surrendered, licensed or otherwise affected by this document.
+ b. Affirmer offers the Work as-is and makes no representations or
+ warranties of any kind concerning the Work, express, implied,
+ statutory or otherwise, including without limitation warranties of
+ title, merchantability, fitness for a particular purpose, non
+ infringement, or the absence of latent or other defects, accuracy, or
+ the present or absence of errors, whether or not discoverable, all to
+ the greatest extent permissible under applicable law.
+ c. Affirmer disclaims responsibility for clearing rights of other persons
+ that may apply to the Work or any use thereof, including without
+ limitation any person's Copyright and Related Rights in the Work.
+ Further, Affirmer disclaims responsibility for obtaining any necessary
+ consents, permissions or other rights required for any use of the
+ Work.
+ d. Affirmer understands and acknowledges that Creative Commons is not a
+ party to this document and has no duty or obligation with respect to
+ this CC0 or use of the Work.
diff --git a/libraries/testdata/libraries/Arduino_TestOff/README.md b/libraries/testdata/libraries/Arduino_TestOff/README.md
new file mode 100644
index 00000000..e69de29b
diff --git a/libraries/testdata/libraries/Arduino_TestOff/examples/Example/Example.ino b/libraries/testdata/libraries/Arduino_TestOff/examples/Example/Example.ino
new file mode 100644
index 00000000..660bdbcc
--- /dev/null
+++ b/libraries/testdata/libraries/Arduino_TestOff/examples/Example/Example.ino
@@ -0,0 +1,2 @@
+void setup() {}
+void loop() {}
diff --git a/libraries/testdata/libraries/Arduino_TestOff/library.properties b/libraries/testdata/libraries/Arduino_TestOff/library.properties
new file mode 100644
index 00000000..92c76353
--- /dev/null
+++ b/libraries/testdata/libraries/Arduino_TestOff/library.properties
@@ -0,0 +1,9 @@
+name=Arduino_TestOff
+version=1.0.0
+author=Cristian Maglie , Pippo Pluto
+maintainer=Cristian Maglie
+sentence=A library that makes coding a Webserver a breeze.
+paragraph=Supports HTTP1.1 and you can do GET and POST.
+category=Communication
+url=http://example.com/
+architectures=avr
diff --git a/libraries/testdata/libraries/Arduino_TestOff/src/Arduino_TestOff.h b/libraries/testdata/libraries/Arduino_TestOff/src/Arduino_TestOff.h
new file mode 100644
index 00000000..e69de29b
diff --git a/libraries/testdata/libraries/Arduino_TestPass/LICENSE.txt b/libraries/testdata/libraries/Arduino_TestPass/LICENSE.txt
new file mode 100644
index 00000000..0e259d42
--- /dev/null
+++ b/libraries/testdata/libraries/Arduino_TestPass/LICENSE.txt
@@ -0,0 +1,121 @@
+Creative Commons Legal Code
+
+CC0 1.0 Universal
+
+ CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
+ LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN
+ ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
+ INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
+ REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS
+ PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
+ THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED
+ HEREUNDER.
+
+Statement of Purpose
+
+The laws of most jurisdictions throughout the world automatically confer
+exclusive Copyright and Related Rights (defined below) upon the creator
+and subsequent owner(s) (each and all, an "owner") of an original work of
+authorship and/or a database (each, a "Work").
+
+Certain owners wish to permanently relinquish those rights to a Work for
+the purpose of contributing to a commons of creative, cultural and
+scientific works ("Commons") that the public can reliably and without fear
+of later claims of infringement build upon, modify, incorporate in other
+works, reuse and redistribute as freely as possible in any form whatsoever
+and for any purposes, including without limitation commercial purposes.
+These owners may contribute to the Commons to promote the ideal of a free
+culture and the further production of creative, cultural and scientific
+works, or to gain reputation or greater distribution for their Work in
+part through the use and efforts of others.
+
+For these and/or other purposes and motivations, and without any
+expectation of additional consideration or compensation, the person
+associating CC0 with a Work (the "Affirmer"), to the extent that he or she
+is an owner of Copyright and Related Rights in the Work, voluntarily
+elects to apply CC0 to the Work and publicly distribute the Work under its
+terms, with knowledge of his or her Copyright and Related Rights in the
+Work and the meaning and intended legal effect of CC0 on those rights.
+
+1. Copyright and Related Rights. A Work made available under CC0 may be
+protected by copyright and related or neighboring rights ("Copyright and
+Related Rights"). Copyright and Related Rights include, but are not
+limited to, the following:
+
+ i. the right to reproduce, adapt, distribute, perform, display,
+ communicate, and translate a Work;
+ ii. moral rights retained by the original author(s) and/or performer(s);
+iii. publicity and privacy rights pertaining to a person's image or
+ likeness depicted in a Work;
+ iv. rights protecting against unfair competition in regards to a Work,
+ subject to the limitations in paragraph 4(a), below;
+ v. rights protecting the extraction, dissemination, use and reuse of data
+ in a Work;
+ vi. database rights (such as those arising under Directive 96/9/EC of the
+ European Parliament and of the Council of 11 March 1996 on the legal
+ protection of databases, and under any national implementation
+ thereof, including any amended or successor version of such
+ directive); and
+vii. other similar, equivalent or corresponding rights throughout the
+ world based on applicable law or treaty, and any national
+ implementations thereof.
+
+2. Waiver. To the greatest extent permitted by, but not in contravention
+of, applicable law, Affirmer hereby overtly, fully, permanently,
+irrevocably and unconditionally waives, abandons, and surrenders all of
+Affirmer's Copyright and Related Rights and associated claims and causes
+of action, whether now known or unknown (including existing as well as
+future claims and causes of action), in the Work (i) in all territories
+worldwide, (ii) for the maximum duration provided by applicable law or
+treaty (including future time extensions), (iii) in any current or future
+medium and for any number of copies, and (iv) for any purpose whatsoever,
+including without limitation commercial, advertising or promotional
+purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each
+member of the public at large and to the detriment of Affirmer's heirs and
+successors, fully intending that such Waiver shall not be subject to
+revocation, rescission, cancellation, termination, or any other legal or
+equitable action to disrupt the quiet enjoyment of the Work by the public
+as contemplated by Affirmer's express Statement of Purpose.
+
+3. Public License Fallback. Should any part of the Waiver for any reason
+be judged legally invalid or ineffective under applicable law, then the
+Waiver shall be preserved to the maximum extent permitted taking into
+account Affirmer's express Statement of Purpose. In addition, to the
+extent the Waiver is so judged Affirmer hereby grants to each affected
+person a royalty-free, non transferable, non sublicensable, non exclusive,
+irrevocable and unconditional license to exercise Affirmer's Copyright and
+Related Rights in the Work (i) in all territories worldwide, (ii) for the
+maximum duration provided by applicable law or treaty (including future
+time extensions), (iii) in any current or future medium and for any number
+of copies, and (iv) for any purpose whatsoever, including without
+limitation commercial, advertising or promotional purposes (the
+"License"). The License shall be deemed effective as of the date CC0 was
+applied by Affirmer to the Work. Should any part of the License for any
+reason be judged legally invalid or ineffective under applicable law, such
+partial invalidity or ineffectiveness shall not invalidate the remainder
+of the License, and in such case Affirmer hereby affirms that he or she
+will not (i) exercise any of his or her remaining Copyright and Related
+Rights in the Work or (ii) assert any associated claims and causes of
+action with respect to the Work, in either case contrary to Affirmer's
+express Statement of Purpose.
+
+4. Limitations and Disclaimers.
+
+ a. No trademark or patent rights held by Affirmer are waived, abandoned,
+ surrendered, licensed or otherwise affected by this document.
+ b. Affirmer offers the Work as-is and makes no representations or
+ warranties of any kind concerning the Work, express, implied,
+ statutory or otherwise, including without limitation warranties of
+ title, merchantability, fitness for a particular purpose, non
+ infringement, or the absence of latent or other defects, accuracy, or
+ the present or absence of errors, whether or not discoverable, all to
+ the greatest extent permissible under applicable law.
+ c. Affirmer disclaims responsibility for clearing rights of other persons
+ that may apply to the Work or any use thereof, including without
+ limitation any person's Copyright and Related Rights in the Work.
+ Further, Affirmer disclaims responsibility for obtaining any necessary
+ consents, permissions or other rights required for any use of the
+ Work.
+ d. Affirmer understands and acknowledges that Creative Commons is not a
+ party to this document and has no duty or obligation with respect to
+ this CC0 or use of the Work.
diff --git a/libraries/testdata/libraries/Arduino_TestPass/README.md b/libraries/testdata/libraries/Arduino_TestPass/README.md
new file mode 100644
index 00000000..e69de29b
diff --git a/libraries/testdata/libraries/Arduino_TestPass/examples/Example/Example.ino b/libraries/testdata/libraries/Arduino_TestPass/examples/Example/Example.ino
new file mode 100644
index 00000000..660bdbcc
--- /dev/null
+++ b/libraries/testdata/libraries/Arduino_TestPass/examples/Example/Example.ino
@@ -0,0 +1,2 @@
+void setup() {}
+void loop() {}
diff --git a/libraries/testdata/libraries/Arduino_TestPass/library.properties b/libraries/testdata/libraries/Arduino_TestPass/library.properties
new file mode 100644
index 00000000..eb0a84fb
--- /dev/null
+++ b/libraries/testdata/libraries/Arduino_TestPass/library.properties
@@ -0,0 +1,9 @@
+name=Arduino_TestPass
+version=1.0.0
+author=Cristian Maglie , Pippo Pluto
+maintainer=Cristian Maglie
+sentence=A library that makes coding a Webserver a breeze.
+paragraph=Supports HTTP1.1 and you can do GET and POST.
+category=Communication
+url=http://example.com/
+architectures=avr
diff --git a/libraries/testdata/libraries/Arduino_TestPass/src/Arduino_TestPass.h b/libraries/testdata/libraries/Arduino_TestPass/src/Arduino_TestPass.h
new file mode 100644
index 00000000..e69de29b
diff --git a/libraries/testdata/libraries/Arduino_TestWarn/LICENSE.txt b/libraries/testdata/libraries/Arduino_TestWarn/LICENSE.txt
new file mode 100644
index 00000000..0e259d42
--- /dev/null
+++ b/libraries/testdata/libraries/Arduino_TestWarn/LICENSE.txt
@@ -0,0 +1,121 @@
+Creative Commons Legal Code
+
+CC0 1.0 Universal
+
+ CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
+ LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN
+ ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
+ INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
+ REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS
+ PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
+ THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED
+ HEREUNDER.
+
+Statement of Purpose
+
+The laws of most jurisdictions throughout the world automatically confer
+exclusive Copyright and Related Rights (defined below) upon the creator
+and subsequent owner(s) (each and all, an "owner") of an original work of
+authorship and/or a database (each, a "Work").
+
+Certain owners wish to permanently relinquish those rights to a Work for
+the purpose of contributing to a commons of creative, cultural and
+scientific works ("Commons") that the public can reliably and without fear
+of later claims of infringement build upon, modify, incorporate in other
+works, reuse and redistribute as freely as possible in any form whatsoever
+and for any purposes, including without limitation commercial purposes.
+These owners may contribute to the Commons to promote the ideal of a free
+culture and the further production of creative, cultural and scientific
+works, or to gain reputation or greater distribution for their Work in
+part through the use and efforts of others.
+
+For these and/or other purposes and motivations, and without any
+expectation of additional consideration or compensation, the person
+associating CC0 with a Work (the "Affirmer"), to the extent that he or she
+is an owner of Copyright and Related Rights in the Work, voluntarily
+elects to apply CC0 to the Work and publicly distribute the Work under its
+terms, with knowledge of his or her Copyright and Related Rights in the
+Work and the meaning and intended legal effect of CC0 on those rights.
+
+1. Copyright and Related Rights. A Work made available under CC0 may be
+protected by copyright and related or neighboring rights ("Copyright and
+Related Rights"). Copyright and Related Rights include, but are not
+limited to, the following:
+
+ i. the right to reproduce, adapt, distribute, perform, display,
+ communicate, and translate a Work;
+ ii. moral rights retained by the original author(s) and/or performer(s);
+iii. publicity and privacy rights pertaining to a person's image or
+ likeness depicted in a Work;
+ iv. rights protecting against unfair competition in regards to a Work,
+ subject to the limitations in paragraph 4(a), below;
+ v. rights protecting the extraction, dissemination, use and reuse of data
+ in a Work;
+ vi. database rights (such as those arising under Directive 96/9/EC of the
+ European Parliament and of the Council of 11 March 1996 on the legal
+ protection of databases, and under any national implementation
+ thereof, including any amended or successor version of such
+ directive); and
+vii. other similar, equivalent or corresponding rights throughout the
+ world based on applicable law or treaty, and any national
+ implementations thereof.
+
+2. Waiver. To the greatest extent permitted by, but not in contravention
+of, applicable law, Affirmer hereby overtly, fully, permanently,
+irrevocably and unconditionally waives, abandons, and surrenders all of
+Affirmer's Copyright and Related Rights and associated claims and causes
+of action, whether now known or unknown (including existing as well as
+future claims and causes of action), in the Work (i) in all territories
+worldwide, (ii) for the maximum duration provided by applicable law or
+treaty (including future time extensions), (iii) in any current or future
+medium and for any number of copies, and (iv) for any purpose whatsoever,
+including without limitation commercial, advertising or promotional
+purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each
+member of the public at large and to the detriment of Affirmer's heirs and
+successors, fully intending that such Waiver shall not be subject to
+revocation, rescission, cancellation, termination, or any other legal or
+equitable action to disrupt the quiet enjoyment of the Work by the public
+as contemplated by Affirmer's express Statement of Purpose.
+
+3. Public License Fallback. Should any part of the Waiver for any reason
+be judged legally invalid or ineffective under applicable law, then the
+Waiver shall be preserved to the maximum extent permitted taking into
+account Affirmer's express Statement of Purpose. In addition, to the
+extent the Waiver is so judged Affirmer hereby grants to each affected
+person a royalty-free, non transferable, non sublicensable, non exclusive,
+irrevocable and unconditional license to exercise Affirmer's Copyright and
+Related Rights in the Work (i) in all territories worldwide, (ii) for the
+maximum duration provided by applicable law or treaty (including future
+time extensions), (iii) in any current or future medium and for any number
+of copies, and (iv) for any purpose whatsoever, including without
+limitation commercial, advertising or promotional purposes (the
+"License"). The License shall be deemed effective as of the date CC0 was
+applied by Affirmer to the Work. Should any part of the License for any
+reason be judged legally invalid or ineffective under applicable law, such
+partial invalidity or ineffectiveness shall not invalidate the remainder
+of the License, and in such case Affirmer hereby affirms that he or she
+will not (i) exercise any of his or her remaining Copyright and Related
+Rights in the Work or (ii) assert any associated claims and causes of
+action with respect to the Work, in either case contrary to Affirmer's
+express Statement of Purpose.
+
+4. Limitations and Disclaimers.
+
+ a. No trademark or patent rights held by Affirmer are waived, abandoned,
+ surrendered, licensed or otherwise affected by this document.
+ b. Affirmer offers the Work as-is and makes no representations or
+ warranties of any kind concerning the Work, express, implied,
+ statutory or otherwise, including without limitation warranties of
+ title, merchantability, fitness for a particular purpose, non
+ infringement, or the absence of latent or other defects, accuracy, or
+ the present or absence of errors, whether or not discoverable, all to
+ the greatest extent permissible under applicable law.
+ c. Affirmer disclaims responsibility for clearing rights of other persons
+ that may apply to the Work or any use thereof, including without
+ limitation any person's Copyright and Related Rights in the Work.
+ Further, Affirmer disclaims responsibility for obtaining any necessary
+ consents, permissions or other rights required for any use of the
+ Work.
+ d. Affirmer understands and acknowledges that Creative Commons is not a
+ party to this document and has no duty or obligation with respect to
+ this CC0 or use of the Work.
diff --git a/libraries/testdata/libraries/Arduino_TestWarn/README.md b/libraries/testdata/libraries/Arduino_TestWarn/README.md
new file mode 100644
index 00000000..e69de29b
diff --git a/libraries/testdata/libraries/Arduino_TestWarn/examples/Example/Example.ino b/libraries/testdata/libraries/Arduino_TestWarn/examples/Example/Example.ino
new file mode 100644
index 00000000..660bdbcc
--- /dev/null
+++ b/libraries/testdata/libraries/Arduino_TestWarn/examples/Example/Example.ino
@@ -0,0 +1,2 @@
+void setup() {}
+void loop() {}
diff --git a/libraries/testdata/libraries/Arduino_TestWarn/library.properties b/libraries/testdata/libraries/Arduino_TestWarn/library.properties
new file mode 100644
index 00000000..258089ba
--- /dev/null
+++ b/libraries/testdata/libraries/Arduino_TestWarn/library.properties
@@ -0,0 +1,9 @@
+name=Arduino TestWarn
+version=1.0.0
+author=Cristian Maglie , Pippo Pluto
+maintainer=Cristian Maglie
+sentence=A library that makes coding a Webserver a breeze.
+paragraph=Supports HTTP1.1 and you can do GET and POST.
+category=Communication
+url=http://example.com/
+architectures=avr
diff --git a/libraries/testdata/libraries/Arduino_TestWarn/src/Arduino_TestWarn.h b/libraries/testdata/libraries/Arduino_TestWarn/src/Arduino_TestWarn.h
new file mode 100644
index 00000000..e69de29b
diff --git a/sync_libraries.go b/sync_libraries.go
index 720adcca..ca561a10 100644
--- a/sync_libraries.go
+++ b/sync_libraries.go
@@ -290,11 +290,6 @@ func syncLibraryTaggedRelease(logger *log.Logger, repo *libraries.Repository, ta
return nil
}
- // Check if the library has undesried files
- if err := libraries.FailIfHasUndesiredFiles(repo.FolderPath); err != nil {
- return err
- }
-
if !config.DoNotRunClamav {
if out, err := libraries.RunAntiVirus(repo.FolderPath); err != nil {
logger.Printf("clamav output:\n%s", out)
@@ -302,6 +297,21 @@ func syncLibraryTaggedRelease(logger *log.Logger, repo *libraries.Repository, ta
}
}
+ report, err := libraries.RunArduinoLint(repo.FolderPath, repoMeta)
+ reportTemplate := `Arduino Lint %s:
+Click to expand Arduino Lint report
+
+%s
+
+ `
+ if err != nil {
+ logger.Printf(reportTemplate, "found errors", report)
+ return err
+ }
+ if report != nil {
+ logger.Printf(reportTemplate, "has suggestions for possible improvements", report)
+ }
+
zipName := libraries.ZipFolderName(library)
lib := filepath.Base(filepath.Clean(filepath.Join(repo.FolderPath, "..")))
host := filepath.Base(filepath.Clean(filepath.Join(repo.FolderPath, "..", "..")))