summaryrefslogtreecommitdiffstats
path: root/tools/lint/file-whitespace/__init__.py
diff options
context:
space:
mode:
Diffstat (limited to 'tools/lint/file-whitespace/__init__.py')
-rw-r--r--tools/lint/file-whitespace/__init__.py124
1 files changed, 124 insertions, 0 deletions
diff --git a/tools/lint/file-whitespace/__init__.py b/tools/lint/file-whitespace/__init__.py
new file mode 100644
index 0000000000..ab7a6944b7
--- /dev/null
+++ b/tools/lint/file-whitespace/__init__.py
@@ -0,0 +1,124 @@
+# 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}