# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
from mozlint
import result
from mozlint.pathutils
import expand_exclusions
results = []
def lint(paths, config, fix=
None, **lintargs):
files = list(expand_exclusions(paths, config, lintargs[
"root"]))
log = lintargs[
"log"]
fixed = 0
for f
in files:
with open(f,
"rb")
as open_file:
hasFix =
False
content_to_write = []
try:
lines = open_file.readlines()
# Check for Empty spaces or newline character at end of file
if lines[:].__len__() != 0
and lines[-1:][0].strip().__len__() == 0:
# return file pointer to first
open_file.seek(0)
if fix:
fixed += 1
# fix Empty lines at end of file
for i, line
in reversed(list(enumerate(open_file))):
# determine if line is empty
if line.strip() != b
"":
with open(f,
"wb")
as write_file:
# determine if file's last line have \n, if not then add a \n
if not lines[i].endswith(b
"\n"):
lines[i] = lines[i] + b
"\n"
# write content to file
for e
in lines[: i + 1]:
write_file.write(e)
# end the loop
break
else:
res = {
"path": f,
"message":
"Empty Lines at end of file",
"level":
"error",
"lineno": open_file.readlines()[:].__len__(),
}
results.append(result.from_config(config, **res))
except Exception
as ex:
log.debug(
"Error: " + str(ex) +
", in file: " + f)
# return file pointer to first
open_file.seek(0)
lines = open_file.readlines()
# Detect missing newline at the end of the file
if lines[:].__len__() != 0
and not lines[-1].endswith(b
"\n"):
if fix:
fixed += 1
with open(f,
"wb")
as write_file:
# add a newline character at end of file
lines[-1] = lines[-1] + b
"\n"
# write content to file
for e
in lines:
write_file.write(e)
else:
res = {
"path": f,
"message":
"File does not end with newline character",
"level":
"error",
"lineno": lines.__len__(),
}
results.append(result.from_config(config, **res))
# return file pointer to first
open_file.seek(0)
for i, line
in enumerate(open_file):
if line.endswith(b
" \n"):
# We found a trailing whitespace
if fix:
# We want to fix it, strip the trailing spaces
content_to_write.append(line.rstrip() + b
"\n")
fixed += 1
hasFix =
True
else:
res = {
"path": f,
"message":
"Trailing whitespace",
"level":
"error",
"lineno": i + 1,
}
results.append(result.from_config(config, **res))
else:
if fix:
content_to_write.append(line)
if hasFix:
# Only update the file when we found a change to make
with open(f,
"wb")
as open_file_to_write:
open_file_to_write.write(b
"".join(content_to_write))
# We are still using the same fp, let's return to the first
# line
open_file.seek(0)
# Open it as once as we just need to know if there is
# at least one \r\n
content = open_file.read()
if b
"\r\n" in content:
if fix:
fixed += 1
content = content.replace(b
"\r\n", b
"\n")
with open(f,
"wb")
as open_file_to_write:
open_file_to_write.write(content)
else:
res = {
"path": f,
"message":
"Windows line return",
"level":
"error",
}
results.append(result.from_config(config, **res))
return {
"results": results,
"fixed": fixed}