| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- #!/usr/bin/env python
- from __future__ import print_function
-
- # Checks
- # - trailing whitespaces (not allowed)
- # - single trailing newline (required)
- # - bad windows/mac line endings
- # - tab characters
- # - lines longer than XX chars
- from os import walk
- from os.path import join
-
- import re
-
- FOLDER = "hw"
- EXTENSIONS = ["rs", "toml", "sh"]
- MAX_WIDTH = 120
-
-
- def get_files():
- file_list = []
-
- # for all files and folders in pwd
- for root, dirs, files in walk("."):
- # if folder starts with "hw"
- if root.startswith("./" + FOLDER):
- # for all files in sub folder of "hw*"
- for file in files:
- # if extension match
- for ext in EXTENSIONS:
- if file.lower().endswith("." + ext):
- file_list.append(join(root, file))
-
- return file_list
-
-
- def check_file(file):
- line_num = 1
- error = False
-
- # open in binary mode to disable universal newlines (to see "\r")
- with open(file, mode='rb') as f:
- content = f.read().decode(encoding='utf-8')
- line_feed = re.compile("\r")
-
- if line_feed.search(content):
- error = True
- print("\t! Contains windows/mac line ending")
-
- if not content.endswith("\n"):
- error = True
- print("\t! Has no single trailing newline")
-
- for line in content.split("\n"):
- line_format = "Line {: >3d}: {}\n\t{}"
- doc_string = re.compile("^\s*//[/!]")
- trailing_whitespaces = re.compile(" +$")
- tab_char = re.compile("\t")
-
- # ignore doc string in rust
- if file.lower().endswith(".rs") and doc_string.match(line):
- continue
-
- if trailing_whitespaces.search(line):
- error = True
- print(line_format.format(line_num, line, "! Line has trailing whitespaces"))
-
- if tab_char.search(line):
- error = True
- print(line_format.format(line_num, line, "! Line has tab character"))
-
- if len(line) >= MAX_WIDTH:
- error = True
- print(line_format.format(line_num, line, "! Line is longer than {} characters".format(MAX_WIDTH)))
-
- line_num += 1
-
- return not error
-
-
- def main():
- errors = 0
-
- for file in get_files():
- print(file)
- if not check_file(file):
- errors += 1
-
- exit(errors)
-
- if __name__ == '__main__':
- main()
|