Index: ps/trunk/.arcconfig =================================================================== --- ps/trunk/.arcconfig +++ ps/trunk/.arcconfig @@ -1,4 +1,5 @@ { "phabricator.uri" : "https://code.wildfiregames.com/", - "repository.callsign" : "P" + "repository.callsign" : "P", + "load": ["build/arclint/pyrolint"] } Index: ps/trunk/.arclint =================================================================== --- ps/trunk/.arclint +++ ps/trunk/.arclint @@ -3,6 +3,7 @@ "(^binaries/system/)", "(^build/premake/premake5/)", "(^source/third_party/)", + "(test_[^.]+.cpp$)", "(^libraries/)" ], "linters": { @@ -14,6 +15,25 @@ "3": "disabled", "5": "disabled" } + }, + "licence-year": { + "type": "licence-year" + }, + "json": { + "type": "json", + "include": "/\\.json$/" + }, + "eslint": { + "type": "eslint", + "bin": ["eslint", "build\\arclint\\dummies\\eslint.bat", "build/arclint/dummies/eslint.php"], + "include": "/\\.js$/", + "config": "build/arclint/configs/eslintrc.json" + }, + "cppcheck": { + "type": "cppcheck", + "bin": ["cppcheck", "build\\arclint\\dummies\\cppcheck.bat", "build/arclint/dummies/cppcheck.php"], + "include": "/\\.(h|cpp)$/", + "flags": ["--max-configs=40", "--language=c++", "--std=c++17", "-Isource/"] } } } Index: ps/trunk/.coafile =================================================================== --- ps/trunk/.coafile +++ ps/trunk/.coafile @@ -1,11 +0,0 @@ -[Source] -bears = CPPCheckBear, LicenseYearBear -language = c++ -files = source/**.(cpp|h) -ignore = source/third_party - -[JS] -bears = ESLintBear, JSHintBear -eslint_config = build/coala/lint-config/eslintrc.json -jshint_config = build/coala/lint-config/jshintrc.json -files = binaries/data/**.js Index: ps/trunk/LICENSE.txt =================================================================== --- ps/trunk/LICENSE.txt +++ ps/trunk/LICENSE.txt @@ -42,6 +42,12 @@ /build Various (unspecified) + /build/arclint + GPL version 2 (or later) - see license_gpl-2.0.txt + + /build/arclint/pyrolint + Apache version 2 - see license_apache2.txt within that directory + /build/premake/premake5 BSD Index: ps/trunk/build/arclint/LICENCE.txt =================================================================== --- ps/trunk/build/arclint/LICENCE.txt +++ ps/trunk/build/arclint/LICENCE.txt @@ -0,0 +1,6 @@ +Files in pyrolint/ (and its subdirectories) are released under the Apache 2 licence. +This matches Arcanist: https://github.com/phacility/arcanist + +Some files are modified from Pinterest/arcanist-linters (also Apache 2), see https://github.com/pinterest/arcanist-linters. The original copyright header has been retained to identify them. + +All other files are released under GPL version 2 or later. Index: ps/trunk/build/arclint/README.md =================================================================== --- ps/trunk/build/arclint/README.md +++ ps/trunk/build/arclint/README.md @@ -0,0 +1,37 @@ +# Linting + +This folder tools for linting 0 A.D. code +Linting is done via Arcanist: https://secure.phabricator.com/book/phabricator/article/arcanist_lint/ + +## Linters + +- `text` is configured to detect whitespace issues. +- `json` detects JSON syntax errors. +- `licence-year` detects Copyright header years and compares against modification time. +- `eslint`, if installed, will run on javascript files. +- `cppcheck`, if installed, will run on C++ files. + + +## Installation + +This assumes you have arcanist already installed. If not, consult https://trac.wildfiregames.com/wiki/Phabricator#UsingArcanist . + +The linting is done via custom PHP scripts, residing in `pyrolint/`. +Configuration is at the root of the project, under `.arclint`. + +### Installing linters + +We provide dummy replacement for external linters, so that they are not required. + +#### eslint + +Installation via npm is recommended. The linter assumes a global installation of both eslint and the "brace-rules" plugin. +`npm install -g eslint@latest eslint-plugin-brace-rules` + +See also https://eslint.org/docs/user-guide/getting-started + +#### cppcheck + +Cppcheck is available on various package managers, including HomeBrew on macOS. +An installer is available on windows. +See http://cppcheck.sourceforge.net for details. Index: ps/trunk/build/arclint/configs/eslintrc.json =================================================================== --- ps/trunk/build/arclint/configs/eslintrc.json +++ ps/trunk/build/arclint/configs/eslintrc.json @@ -0,0 +1,97 @@ +{ + "parserOptions": { + "ecmaVersion": 2020 + }, + "plugins": [ + "brace-rules" + ], + "rules": { + "no-caller": 1, + "no-cond-assign": 1, + "no-constant-condition": ["error", { "checkLoops": false }], + "no-dupe-args": 1, + "no-dupe-keys": 1, + "no-duplicate-case": 1, + "no-empty": 1, + "no-extra-boolean-cast": 0, + "no-extra-parens": 0, + "no-extra-semi": 1, + "no-floating-decimal": 1, + "no-func-assign": 1, + "no-negated-in-lhs": 1, + "no-obj-calls": 1, + "no-unreachable": 1, + "no-use-before-define": ["error", "nofunc"], + "use-isnan": 1, + "valid-jsdoc": 0, + "valid-typeof": 1, + + "block-scoped-var": 0, + "consistent-return": 1, + "default-case": 1, + "dot-notation": 1, + "no-else-return": 1, + "no-invalid-this": 1, + "no-loop-func": 0, + "no-multi-spaces": ["warn", { "ignoreEOLComments": true }], + "no-new": 1, + "no-redeclare": 0, + "no-return-assign": 1, + "no-self-assign": 1, + "no-self-compare": 1, + "no-unmodified-loop-condition": 1, + "no-unused-expressions": 1, + "no-unused-labels": 1, + "no-useless-concat": 0, + "yoda": 1, + + "no-delete-var": 1, + "no-label-var": 1, + "no-shadow-restricted-names": 1, + "no-shadow": 1, + "no-undef": 0, + "no-undef-init": 1, + "no-unused-vars": 0, + + "comma-spacing": 1, + "indent": ["warn", "tab", { "outerIIFEBody": 0 }], + "key-spacing": 1, + "new-cap": 0, + "new-parens": 1, + "no-mixed-spaces-and-tabs": ["warn", "smart-tabs"], + "no-multi-assign": 1, + "no-trailing-spaces": 1, + "no-unneeded-ternary": 1, + "no-irregular-whitespace": 1, + "object-curly-spacing": ["warn", "always"], + "operator-assignment": 1, + "operator-linebreak": ["warn", "after"], + "quote-props": 1, + "semi": 1, + "semi-spacing": 1, + "space-before-function-paren": ["warn", "never"], + "space-in-parens": 1, + "space-unary-ops": 1, + "spaced-comment": ["warn", "always"], + + "no-class-assign": 1, + "no-const-assign": 1, + "no-dupe-class-members" : 1, + "prefer-const": 0, + + "brace-rules/brace-on-same-line": ["warn", { + "FunctionDeclaration": "never", + "FunctionExpression": "ignore", + "ArrowFunctionExpression": "always", + "IfStatement": "never", + "TryStatement": "ignore", + "CatchClause": "ignore", + "DoWhileStatement": "never", + "WhileStatement": "never", + "ForStatement": "never", + "ForInStatement": "never", + "ForOfStatement": "never", + "SwitchStatement": "never" + }, { "allowSingleLine": true }] + } +} Index: ps/trunk/build/arclint/dummies/cppcheck.bat =================================================================== --- ps/trunk/build/arclint/dummies/cppcheck.bat +++ ps/trunk/build/arclint/dummies/cppcheck.bat @@ -0,0 +1,2 @@ +@echo off +php build\arclint\dummies\cppcheck.php Index: ps/trunk/build/arclint/dummies/cppcheck.php =================================================================== --- ps/trunk/build/arclint/dummies/cppcheck.php +++ ps/trunk/build/arclint/dummies/cppcheck.php @@ -0,0 +1,43 @@ +#!/usr/bin/env php +. + */ + + +/** + * This file replaces cppcheck if the former is not found, to avoid failure in 'arc lint'. + * It is written in PHP as we can assume php is installed if arcanist is to work at all. + * It mimics `cppcheck --xml`. + * Set the VERBOSE env variable to generate an 'advice' level lint message. + */ + +$verbose = getenv("VERBOSE") ? getenv("VERBOSE") : false; + +$advice = !$verbose ? "" : << + + +EOD; + +$str = << +$advice +EOD; + +fwrite(STDERR, $str); +?> Index: ps/trunk/build/arclint/dummies/eslint.bat =================================================================== --- ps/trunk/build/arclint/dummies/eslint.bat +++ ps/trunk/build/arclint/dummies/eslint.bat @@ -0,0 +1,2 @@ +@echo off +php build\arclint\dummies\eslint.php Index: ps/trunk/build/arclint/dummies/eslint.php =================================================================== --- ps/trunk/build/arclint/dummies/eslint.php +++ ps/trunk/build/arclint/dummies/eslint.php @@ -0,0 +1,45 @@ +#!/usr/bin/env php +. + */ + + +/** + * This file replaces eslint if the former is not found, to avoid failure in 'arc lint'. + * It is written in PHP as we can assume php is installed if arcanist is to work at all. + * It mimics `eslint --format json`. + * Set the VERBOSE env variable to generate an 'advice' level lint message. + */ + +$verbose = getenv("VERBOSE") ? getenv("VERBOSE") : false; + +$advice = << Index: ps/trunk/build/arclint/pyrolint/LICENCE_apache2.txt =================================================================== --- ps/trunk/build/arclint/pyrolint/LICENCE_apache2.txt +++ ps/trunk/build/arclint/pyrolint/LICENCE_apache2.txt @@ -0,0 +1,201 @@ +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. Index: ps/trunk/build/arclint/pyrolint/__phutil_library_init__.php =================================================================== --- ps/trunk/build/arclint/pyrolint/__phutil_library_init__.php +++ ps/trunk/build/arclint/pyrolint/__phutil_library_init__.php @@ -0,0 +1,3 @@ + 2, + 'class' => array( + 'ESLintLinter' => 'src/ESLintLinter.php', + 'LicenceYearLinter' => 'src/LicenceYearLinter.php', + ), + 'function' => array(), + 'xmap' => array( + 'ESLintLinter' => 'ArcanistExternalLinter', + 'LicenceYearLinter' => 'ArcanistLinter', + ), +)); Index: ps/trunk/build/arclint/pyrolint/src/ESLintLinter.php =================================================================== --- ps/trunk/build/arclint/pyrolint/src/ESLintLinter.php +++ ps/trunk/build/arclint/pyrolint/src/ESLintLinter.php @@ -0,0 +1,122 @@ +config, + // This allows globally installing plugins even with eslint 6+ + '--resolve-plugins-relative-to', + strtok($stdout, "\n") + ); + } + + public function getLinterConfigurationOptions() { + $options = array( + 'config' => array( + 'type' => 'optional string', + 'help' => pht('Link to the config file.'), + ), + ); + return $options + parent::getLinterConfigurationOptions(); + } + + public function setLinterConfigurationValue($key, $value) { + switch ($key) { + case 'config': + $this->config = $value; + return; + } + return parent::setLinterConfigurationValue($key, $value); + } + + protected function parseLinterOutput($path, $err, $stdout, $stderr) { + // Gate on $stderr b/c $err (exit code) is expected. + if ($stderr) { + return false; + } + + $json = json_decode($stdout, true); + $messages = array(); + + foreach ($json as $file) { + foreach ($file['messages'] as $offense) { + // Skip file ignored warning: if a file is ignored by .eslintingore + // but linted explicitly (by arcanist), a warning will be reported, + // containing only: `{fatal:false,severity:1,message:...}`. + if (strpos($offense['message'], "File ignored ") === 0) { + continue; + } + + $message = new ArcanistLintMessage(); + $message->setPath($file['filePath']); + $message->setSeverity($this->mapSeverity(idx($offense, 'severity', '0'))); + $message->setName(nonempty(idx($offense, 'ruleId'), 'unknown')); + $message->setDescription(idx($offense, 'message')); + $message->setLine(idx($offense, 'line')); + $message->setChar(idx($offense, 'column')); + $message->setCode($this->getLinterName()); + $messages[] = $message; + } + } + + return $messages; + } + + private function mapSeverity($eslintSeverity) { + switch($eslintSeverity) { + case '0': + return ArcanistLintSeverity::SEVERITY_ADVICE; + case '1': + return ArcanistLintSeverity::SEVERITY_WARNING; + case '2': + default: + return ArcanistLintSeverity::SEVERITY_ERROR; + } + } +} Index: ps/trunk/build/arclint/pyrolint/src/LicenceYearLinter.php =================================================================== --- ps/trunk/build/arclint/pyrolint/src/LicenceYearLinter.php +++ ps/trunk/build/arclint/pyrolint/src/LicenceYearLinter.php @@ -0,0 +1,78 @@ + ArcanistLintSeverity::SEVERITY_ERROR, + ); + } + + public function getLintNameMap() { + return array( + self::BAD_YEAR => pht('Inaccurate Copyright Year'), + ); + } + + public function lintPath($path) { + $txt = $this->getData($path); + + $matches = null; + $preg = preg_match_all( + "/Copyright( \(C\))? (20[0-9]{2}) Wildfire Games/", + $txt, + $matches, + PREG_OFFSET_CAPTURE); + + if (!$preg) { + return; + } + + $year = date("Y", filemtime($path)); + foreach ($matches[2] as $match) { + list($string, $offset) = $match; + if ($string == $year) { + continue; + } + $this->raiseLintAtOffset( + $offset, + self::BAD_YEAR, + pht('Inaccurate Copyright Year'), + $string, + "$year"); + } + } +} Index: ps/trunk/build/coala/LicenseYearBear.py =================================================================== --- ps/trunk/build/coala/LicenseYearBear.py +++ ps/trunk/build/coala/LicenseYearBear.py @@ -1,59 +0,0 @@ -from coalib.bears.LocalBear import LocalBear -from coalib.results.Result import Result -from os.path import getmtime -from re import compile -from datetime import date -# Requires https://pypi.python.org/pypi/svn -from svn.local import LocalClient -from svn.exception import SvnException - - -class LicenseYearBear(LocalBear): - - """ - Detects a wrong year of a license header - """ - - LANGUAGES = {'C', 'C++'} - AUTHORS = {'Vladislav Belov'} - LICENSE = 'GPL-2.0' - CAN_DETECT = {'Documentation', 'Formatting'} - - def get_last_modification(self, filename): - client = LocalClient(filename) - was_modified = False - for status in client.status(): - if status.type_raw_name == 'modified': - was_modified = True - break - if not was_modified: - try: - return client.info()['commit_date'].year - except (AttributeError, SvnException): - return None - else: - return date.today().year - - def run(self, filename, file): - modification_year = self.get_last_modification(filename) - if not modification_year: - return - license_regexp = compile('/\* Copyright \([cC]?\) ([\d]+) Wildfire Games') - - for line_number, line in enumerate(file): - match = license_regexp.search(line) - if not match: - break - - license_year = match.group(1) - if not license_year: - break - - license_year = int(license_year) - if modification_year == license_year: - break - - return [Result.from_values(origin=self, - message='License should have "%d" year instead of "%d"' % (modification_year, license_year), - file=filename, line=line_number + 1)] - Index: ps/trunk/build/coala/lint-config/eslintrc.json =================================================================== --- ps/trunk/build/coala/lint-config/eslintrc.json +++ ps/trunk/build/coala/lint-config/eslintrc.json @@ -1,97 +0,0 @@ -{ - "parserOptions": { - "ecmaVersion": 6 - }, - "plugins": [ - "brace-rules" - ], - "rules": { - "no-caller": 1, - "no-cond-assign": 1, - "no-constant-condition": ["error", { "checkLoops": false }], - "no-dupe-args": 1, - "no-dupe-keys": 1, - "no-duplicate-case": 1, - "no-empty": 1, - "no-extra-boolean-cast": 0, - "no-extra-parens": 0, - "no-extra-semi": 1, - "no-floating-decimal": 1, - "no-func-assign": 1, - "no-negated-in-lhs": 1, - "no-obj-calls": 1, - "no-unreachable": 1, - "no-use-before-define": ["error", "nofunc"], - "use-isnan": 1, - "valid-jsdoc": 0, - "valid-typeof": 1, - - "block-scoped-var": 0, - "consistent-return": 1, - "default-case": 1, - "dot-notation": 1, - "no-else-return": 1, - "no-invalid-this": 1, - "no-loop-func": 0, - "no-multi-spaces": ["warn", { "ignoreEOLComments": true }], - "no-new": 1, - "no-redeclare": 0, - "no-return-assign": 1, - "no-self-assign": 1, - "no-self-compare": 1, - "no-unmodified-loop-condition": 1, - "no-unused-expressions": 1, - "no-unused-labels": 1, - "no-useless-concat": 0, - "yoda": 1, - - "no-delete-var": 1, - "no-label-var": 1, - "no-shadow-restricted-names": 1, - "no-shadow": 1, - "no-undef": 0, - "no-undef-init": 1, - "no-unused-vars": 0, - - "comma-spacing": 1, - "indent": ["warn", "tab", { "outerIIFEBody": 0 }], - "key-spacing": 1, - "new-cap": 0, - "new-parens": 1, - "no-mixed-spaces-and-tabs": ["warn", "smart-tabs"], - "no-multi-assign": 1, - "no-trailing-spaces": 1, - "no-unneeded-ternary": 1, - "no-irregular-whitespace": 1, - "object-curly-spacing": ["warn", "always"], - "operator-assignment": 1, - "operator-linebreak": ["warn", "after"], - "quote-props": 1, - "semi": 1, - "semi-spacing": 1, - "space-before-function-paren": ["warn", "never"], - "space-in-parens": 1, - "space-unary-ops": 1, - "spaced-comment": ["warn", "always"], - - "no-class-assign": 1, - "no-const-assign": 1, - "no-dupe-class-members" : 1, - "prefer-const": 0, - - "brace-rules/brace-on-same-line": ["warn", { - "FunctionDeclaration": "never", - "FunctionExpression": "ignore", - "ArrowFunctionExpression": "always", - "IfStatement": "never", - "TryStatement": "ignore", - "CatchClause": "ignore", - "DoWhileStatement": "never", - "WhileStatement": "never", - "ForStatement": "never", - "ForInStatement": "never", - "ForOfStatement": "never", - "SwitchStatement": "never" - }, { "allowSingleLine": true }] - } -} Index: ps/trunk/build/coala/lint-config/jshintrc.json =================================================================== --- ps/trunk/build/coala/lint-config/jshintrc.json +++ ps/trunk/build/coala/lint-config/jshintrc.json @@ -1,11 +0,0 @@ -{ - "esversion": 6, - "eqeqeq": false, - "freeze": true, - "latedef": "nofunc", - "loopfunc": true, - "noarg": true, - "nonbsp": true, - "undef": false, - "unused": false -} Index: ps/trunk/build/jenkins/dockerfiles/coala.Dockerfile =================================================================== --- ps/trunk/build/jenkins/dockerfiles/coala.Dockerfile +++ ps/trunk/build/jenkins/dockerfiles/coala.Dockerfile @@ -1,22 +0,0 @@ -FROM python:3.8 - -RUN useradd --uid 1006 builder - -RUN apt-get -yy update && apt-get -yy install \ - cppcheck \ - git \ - npm \ - subversion - -RUN npm install -g npm@latest -RUN npm install -g eslint@5.16.0 jshint eslint-plugin-brace-rules - -RUN pip3 install svn - -RUN git clone -b 0ad-fixes https://github.com/0ad/coala.git -RUN cd coala && pip3 install . - -RUN git clone -b 0ad-fixes https://github.com/0ad/coala-bears.git -RUN cd coala-bears && pip3 install . - -USER builder Index: ps/trunk/build/jenkins/pipelines/docker-differential.Jenkinsfile =================================================================== --- ps/trunk/build/jenkins/pipelines/docker-differential.Jenkinsfile +++ ps/trunk/build/jenkins/pipelines/docker-differential.Jenkinsfile @@ -1,4 +1,4 @@ -/* Copyright (C) 2020 Wildfire Games. +/* Copyright (C) 2021 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -147,16 +147,9 @@ steps { script { try { - withDockerContainer("0ad-coala:latest") { - sh ''' - svn st | grep '^[AM]' | cut -c 9- | xargs coala -d build/coala --ci --disable-caching \ - --format '{{ "name": "{origin}", "code": "{origin}", "severity": "{severity_str}", "path": "{file}", "line": {line}, "description": "`{message}`" }}' \ - --limit-files > coala-report - ''' - } + sh 'arc lint --output json > .phabricator-lint' } catch (e) { - sh 'sed -i "s|$(pwd)/||g" coala-report' - sh 'sed -e "s/INFO/advice/g" -e "s/NORMAL/warning/g" -e "s/MAJOR/error/g" coala-report > .phabricator-lint' + sh 'echo \"{ \\\"name\\\": \\\"error\\\", \\\"severity\\\": \\\"error\\\", \\\"code\\\": \\\"0\\\", \\\"description\\\": \\\"lint could not run\\\" }\" > .phabricator-lint ' } } }