Add a pre commit hook to lint code
This uses pre-commit [1] to check patches are well formed and run several linters on them. We currently do some boring things (check files are syntactically valid) as well as some project-specific ones: - Run illuaminate on the Lua files - Run checkstyle on Java [1]: https://pre-commit.com/
This commit is contained in:
parent
74dae4ec17
commit
eb2d617ed8
|
@ -16,6 +16,3 @@ indent_size = 2
|
||||||
|
|
||||||
[*.yml]
|
[*.yml]
|
||||||
indent_size = 2
|
indent_size = 2
|
||||||
|
|
||||||
[*.properties]
|
|
||||||
insert_final_newline = false
|
|
||||||
|
|
|
@ -23,10 +23,15 @@ jobs:
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{ runner.os }}-gradle-
|
${{ runner.os }}-gradle-
|
||||||
|
|
||||||
|
- name: Disable Gradle daemon
|
||||||
|
run: |
|
||||||
|
mkdir -p ~/.gradle
|
||||||
|
echo "org.gradle.daemon=false" >> ~/.gradle/gradle.properties
|
||||||
|
|
||||||
- name: Build with Gradle
|
- name: Build with Gradle
|
||||||
run: |
|
run: |
|
||||||
./gradlew assemble --no-daemon || ./gradlew assemble --no-daemon
|
./gradlew assemble || ./gradlew assemble
|
||||||
./gradlew downloadAssets --no-daemon || ./gradlew downloadAssets --no-daemon
|
./gradlew downloadAssets || ./gradlew downloadAssets
|
||||||
./gradlew build
|
./gradlew build
|
||||||
|
|
||||||
- name: Upload Jar
|
- name: Upload Jar
|
||||||
|
@ -39,15 +44,14 @@ jobs:
|
||||||
run: bash <(curl -s https://codecov.io/bash)
|
run: bash <(curl -s https://codecov.io/bash)
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
|
|
||||||
- name: Generate Java documentation stubs
|
- name: Cache pre-commit
|
||||||
run: ./gradlew luaJavadoc --no-daemon
|
uses: actions/cache@v2
|
||||||
|
with:
|
||||||
- name: Lint Lua code
|
path: ~/.cache/pre-commit
|
||||||
|
key: ${{ runner.os }}-pre-commit-${{ hashFiles('config/pre-commit/config.yml') }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-pre-commit-
|
||||||
|
- name: Run linters
|
||||||
run: |
|
run: |
|
||||||
test -d bin || mkdir bin
|
pip install pre-commit
|
||||||
test -f bin/illuaminate || wget -q -Obin/illuaminate https://squiddev.cc/illuaminate/linux-x86-64/illuaminate
|
pre-commit run --config config/pre-commit/config.yml --show-diff-on-failure --all --color=always
|
||||||
chmod +x bin/illuaminate
|
|
||||||
bin/illuaminate lint
|
|
||||||
|
|
||||||
- name: Check whitespace
|
|
||||||
run: python3 tools/check-lines.py
|
|
||||||
|
|
|
@ -65,7 +65,7 @@ #### Building documentation
|
||||||
|
|
||||||
#### Writing documentation
|
#### Writing documentation
|
||||||
illuaminate's documentation system is not currently documented (somewhat ironic), but is _largely_ the same as
|
illuaminate's documentation system is not currently documented (somewhat ironic), but is _largely_ the same as
|
||||||
[ldoc][ldoc]. Documentation comments are written in Markdown,
|
[ldoc][ldoc]. Documentation comments are written in Markdown,
|
||||||
|
|
||||||
Our markdown engine does _not_ support GitHub flavoured markdown, and so does not support all the features one might
|
Our markdown engine does _not_ support GitHub flavoured markdown, and so does not support all the features one might
|
||||||
expect (such as tables). It is very much recommended that you build and preview the docs locally first.
|
expect (such as tables). It is very much recommended that you build and preview the docs locally first.
|
||||||
|
@ -77,18 +77,18 @@ ### Testing
|
||||||
Before we get into writing tests, it's worth mentioning the various test suites that CC: Tweaked has:
|
Before we get into writing tests, it's worth mentioning the various test suites that CC: Tweaked has:
|
||||||
- "Core" Java (`./src/test/java`): These test core bits of the mod which don't require any Minecraft interaction.
|
- "Core" Java (`./src/test/java`): These test core bits of the mod which don't require any Minecraft interaction.
|
||||||
This includes the `@LuaFunction` system, file system code, etc...
|
This includes the `@LuaFunction` system, file system code, etc...
|
||||||
|
|
||||||
These tests are run by `./gradlew test`.
|
These tests are run by `./gradlew test`.
|
||||||
|
|
||||||
- CraftOS (`./src/test/resources/test-rom/`): These tests are written in Lua, and ensure the Lua environment, libraries
|
- CraftOS (`./src/test/resources/test-rom/`): These tests are written in Lua, and ensure the Lua environment, libraries
|
||||||
and programs work as expected. These are (generally) written to be able to be run on emulators too, to provide some
|
and programs work as expected. These are (generally) written to be able to be run on emulators too, to provide some
|
||||||
sort of compliance test.
|
sort of compliance test.
|
||||||
|
|
||||||
These tests are run by the '"Core" Java' test suite, and so are also run with `./gradlew test`.
|
These tests are run by the '"Core" Java' test suite, and so are also run with `./gradlew test`.
|
||||||
|
|
||||||
- In-game (`./src/test/java/dan200/computercraft/ingame/`): These tests are run on an actual Minecraft server, using
|
- In-game (`./src/test/java/dan200/computercraft/ingame/`): These tests are run on an actual Minecraft server, using
|
||||||
[the same system Mojang do][mc-test]. The aim of these is to test in-game behaviour of blocks and peripherals.
|
[the same system Mojang do][mc-test]. The aim of these is to test in-game behaviour of blocks and peripherals.
|
||||||
|
|
||||||
These are run by `./gradlew testInGame`.
|
These are run by `./gradlew testInGame`.
|
||||||
|
|
||||||
## CraftOS tests
|
## CraftOS tests
|
||||||
|
|
14
LICENSE
14
LICENSE
|
@ -19,14 +19,14 @@ Mod: The mod code designated by the present license, in source form, binary
|
||||||
form, as obtained standalone, as part of a wider distribution or resulting from
|
form, as obtained standalone, as part of a wider distribution or resulting from
|
||||||
the compilation of the original or modified sources.
|
the compilation of the original or modified sources.
|
||||||
|
|
||||||
Dependency: Code required for the mod to work properly. This includes
|
Dependency: Code required for the mod to work properly. This includes
|
||||||
dependencies required to compile the code as well as any file or modification
|
dependencies required to compile the code as well as any file or modification
|
||||||
that is explicitly or implicitly required for the mod to be working.
|
that is explicitly or implicitly required for the mod to be working.
|
||||||
|
|
||||||
1. Scope
|
1. Scope
|
||||||
--------
|
--------
|
||||||
|
|
||||||
The present license is granted to any user of the mod. As a prerequisite,
|
The present license is granted to any user of the mod. As a prerequisite,
|
||||||
a user must own a legally acquired copy of Minecraft
|
a user must own a legally acquired copy of Minecraft
|
||||||
|
|
||||||
2. Liability
|
2. Liability
|
||||||
|
@ -41,13 +41,13 @@ or misuse of this mod fall on the user.
|
||||||
3. Play rights
|
3. Play rights
|
||||||
--------------
|
--------------
|
||||||
|
|
||||||
The user is allowed to install this mod on a Minecraft client or server and to play
|
The user is allowed to install this mod on a Minecraft client or server and to play
|
||||||
without restriction.
|
without restriction.
|
||||||
|
|
||||||
4. Modification rights
|
4. Modification rights
|
||||||
----------------------
|
----------------------
|
||||||
|
|
||||||
The user has the right to decompile the source code, look at either the
|
The user has the right to decompile the source code, look at either the
|
||||||
decompiled version or the original source code, and to modify it.
|
decompiled version or the original source code, and to modify it.
|
||||||
|
|
||||||
5. Distribution of original or modified copy rights
|
5. Distribution of original or modified copy rights
|
||||||
|
@ -61,10 +61,10 @@ include:
|
||||||
- patch to its source or binary files
|
- patch to its source or binary files
|
||||||
- any copy of a portion of its binary source files
|
- any copy of a portion of its binary source files
|
||||||
|
|
||||||
The user is allowed to redistribute this mod partially, in totality, or
|
The user is allowed to redistribute this mod partially, in totality, or
|
||||||
included in a distribution.
|
included in a distribution.
|
||||||
|
|
||||||
When distributing binary files, the user must provide means to obtain its
|
When distributing binary files, the user must provide means to obtain its
|
||||||
entire set of sources or modified sources at no cost.
|
entire set of sources or modified sources at no cost.
|
||||||
|
|
||||||
All distributions of this mod must remain licensed under the CCPL.
|
All distributions of this mod must remain licensed under the CCPL.
|
||||||
|
@ -92,7 +92,7 @@ must be made available at no cost and remain licensed under the CCPL.
|
||||||
---------------
|
---------------
|
||||||
|
|
||||||
If you choose to contribute code or assets to be included in this mod, you
|
If you choose to contribute code or assets to be included in this mod, you
|
||||||
agree that, if added to to the main repository at
|
agree that, if added to to the main repository at
|
||||||
https://github.com/dan200/ComputerCraft, your contributions will be covered by
|
https://github.com/dan200/ComputerCraft, your contributions will be covered by
|
||||||
this license, and that Daniel Ratcliffe will retain the right to re-license the
|
this license, and that Daniel Ratcliffe will retain the right to re-license the
|
||||||
mod, including your contributions, in part or in whole, under other licenses.
|
mod, including your contributions, in part or in whole, under other licenses.
|
||||||
|
|
|
@ -2488,4 +2488,4 @@
|
||||||
</option>
|
</option>
|
||||||
</inspection_tool>
|
</inspection_tool>
|
||||||
</profile>
|
</profile>
|
||||||
</component>
|
</component>
|
||||||
|
|
|
@ -58,4 +58,4 @@
|
||||||
<option name="CONTINUATION_INDENT_SIZE" value="4" />
|
<option name="CONTINUATION_INDENT_SIZE" value="4" />
|
||||||
</indentOptions>
|
</indentOptions>
|
||||||
</codeStyleSettings>
|
</codeStyleSettings>
|
||||||
</code_scheme>
|
</code_scheme>
|
||||||
|
|
|
@ -0,0 +1,48 @@
|
||||||
|
# See https://pre-commit.com for more information
|
||||||
|
# See https://pre-commit.com/hooks.html for more hooks
|
||||||
|
repos:
|
||||||
|
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||||
|
rev: v3.2.0
|
||||||
|
hooks:
|
||||||
|
- id: trailing-whitespace
|
||||||
|
- id: end-of-file-fixer
|
||||||
|
- id: check-merge-conflict
|
||||||
|
|
||||||
|
# Quick syntax checkers
|
||||||
|
- id: check-xml
|
||||||
|
- id: check-yaml
|
||||||
|
- id: check-toml
|
||||||
|
- id: check-json
|
||||||
|
exclude: "tsconfig\\.json$"
|
||||||
|
|
||||||
|
- repo: https://github.com/editorconfig-checker/editorconfig-checker.python
|
||||||
|
rev: 2.3.5
|
||||||
|
hooks:
|
||||||
|
- id: editorconfig-checker
|
||||||
|
args: ['-disable-indentation']
|
||||||
|
exclude: "^(.*\\.(bat)|LICENSE)$"
|
||||||
|
|
||||||
|
- repo: local
|
||||||
|
hooks:
|
||||||
|
- id: checkstyle
|
||||||
|
name: Check Java codestyle
|
||||||
|
files: ".*\\.java$"
|
||||||
|
language: system
|
||||||
|
entry: ./gradlew checkstyleMain checkstyleTest
|
||||||
|
pass_filenames: false
|
||||||
|
require_serial: true
|
||||||
|
- id: illuaminate
|
||||||
|
name: Check Lua code
|
||||||
|
files: ".*\\.(lua|java|md)"
|
||||||
|
language: script
|
||||||
|
entry: config/pre-commit/illuaminate-lint.sh
|
||||||
|
pass_filenames: false
|
||||||
|
require_serial: true
|
||||||
|
|
||||||
|
exclude: |
|
||||||
|
(?x)^(
|
||||||
|
src/generated|
|
||||||
|
src/test/resources/test-rom/data/json-parsing/|
|
||||||
|
src/test/server-files/|
|
||||||
|
config/idea/
|
||||||
|
)
|
|
@ -0,0 +1,9 @@
|
||||||
|
#!/usr/bin/env sh
|
||||||
|
set -e
|
||||||
|
|
||||||
|
test -d bin || mkdir bin
|
||||||
|
test -f bin/illuaminate || curl -s -obin/illuaminate https://squiddev.cc/illuaminate/linux-x86-64/illuaminate
|
||||||
|
chmod +x bin/illuaminate
|
||||||
|
|
||||||
|
./gradlew luaJavadoc
|
||||||
|
bin/illuaminate lint
|
|
@ -20,7 +20,7 @@ ## Example
|
||||||
|
|
||||||
```lua
|
```lua
|
||||||
while true do
|
while true do
|
||||||
local event, key, is_held = os.pullEvent("key")
|
local event, key, is_held = os.pullEvent("key")
|
||||||
print(("%s held=%s"):format(keys.getName(key), is_held))
|
print(("%s held=%s"):format(keys.getName(key), is_held))
|
||||||
end
|
end
|
||||||
```
|
```
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
|
|
||||||
local colours = _ENV
|
local colours = _ENV
|
||||||
for k, v in pairs(colors) do
|
for k, v in pairs(colors) do
|
||||||
colours[k] = v
|
colours[k] = v
|
||||||
end
|
end
|
||||||
|
|
||||||
--- Grey. Written as `7` in paint files and @{term.blit}, has a default
|
--- Grey. Written as `7` in paint files and @{term.blit}, has a default
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
--[[
|
--[[
|
||||||
Alright then, don't ignore me. This file is to ensure the existence of the "autorun" folder, files placed in this folder
|
Alright then, don't ignore me. This file is to ensure the existence of the "autorun" folder, files placed in this folder
|
||||||
using resource packs will always run when computers startup.
|
using resource packs will always run when computers startup.
|
||||||
]]
|
]]
|
||||||
|
|
|
@ -1,45 +0,0 @@
|
||||||
import pathlib, sys
|
|
||||||
|
|
||||||
problems = False
|
|
||||||
|
|
||||||
# Skip images and files without extensions
|
|
||||||
exclude = [
|
|
||||||
"*.png",
|
|
||||||
"**/data/json-parsing/*.json",
|
|
||||||
"**/computers/ids.json",
|
|
||||||
]
|
|
||||||
|
|
||||||
for path in pathlib.Path("src").glob("**/*"):
|
|
||||||
# Ideally we'd use generated as a glob, but .match("generated/**/*.json") doesn't work!
|
|
||||||
if path.is_dir() or path.suffix == "" or any(path.match(x) for x in exclude) or path.parts[1] == "generated":
|
|
||||||
continue
|
|
||||||
|
|
||||||
with path.open(encoding="utf-8") as file:
|
|
||||||
has_dos, has_trailing, first, count = False, False, 0, True
|
|
||||||
for i, line in enumerate(file):
|
|
||||||
if first:
|
|
||||||
first = False
|
|
||||||
if line.strip() == "":
|
|
||||||
print("%s has empty first line" % path)
|
|
||||||
|
|
||||||
if len(line) >= 2 and line[-2] == "\r" and line[-1] == "\n" and not has_dos:
|
|
||||||
print("%s has contains '\\r\\n' on line %d" % (path, i + 1))
|
|
||||||
problems = has_dos = True
|
|
||||||
|
|
||||||
if len(line) >= 2 and line[-2] in " \t" and line[-1] == "\n" and not has_trailing:
|
|
||||||
print("%s has trailing whitespace on line %d" % (path, i + 1))
|
|
||||||
problems = has_trailing = True
|
|
||||||
|
|
||||||
if len(line) == 0 or line[-1] != "\n":
|
|
||||||
count = 0
|
|
||||||
elif line.strip() == "":
|
|
||||||
count += 1
|
|
||||||
else:
|
|
||||||
count = 1
|
|
||||||
|
|
||||||
if count != 1:
|
|
||||||
print("%s should have 1 trailing lines, but has %d" % (path, count))
|
|
||||||
problems = True
|
|
||||||
|
|
||||||
if problems:
|
|
||||||
sys.exit(1)
|
|
Loading…
Reference in New Issue