| 
									
										
										
										
											2018-06-28 13:00:54 -04:00
										 |  |  | #!/usr/bin/env python2 | 
					
						
							|  |  |  | # Check files for whitespace problems | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Copyright (C) 2018  Kevin O'Connor <kevin@koconnor.net> | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # This file may be distributed under the terms of the GNU GPLv3 license. | 
					
						
							| 
									
										
										
										
											2018-07-26 16:00:39 -04:00
										 |  |  | import sys, os.path, unicodedata | 
					
						
							| 
									
										
										
										
											2018-06-28 13:00:54 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | HaveError = False | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def report_error(filename, lineno, msg): | 
					
						
							|  |  |  |     global HaveError | 
					
						
							| 
									
										
										
										
											2018-08-27 13:21:15 -04:00
										 |  |  |     if not HaveError: | 
					
						
							|  |  |  |         sys.stderr.write("\n\nERROR:\nERROR: White space errors\nERROR:\n") | 
					
						
							| 
									
										
										
										
											2018-06-28 13:00:54 -04:00
										 |  |  |     HaveError = True | 
					
						
							| 
									
										
										
										
											2018-08-27 13:21:15 -04:00
										 |  |  |     sys.stderr.write("%s:%d: %s\n" % (filename, lineno + 1, msg)) | 
					
						
							| 
									
										
										
										
											2018-06-28 13:00:54 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | def check_file(filename): | 
					
						
							|  |  |  |     # Open and read file | 
					
						
							|  |  |  |     try: | 
					
						
							|  |  |  |         f = open(filename, 'rb') | 
					
						
							|  |  |  |         data = f.read() | 
					
						
							|  |  |  |         f.close() | 
					
						
							|  |  |  |     except IOError: | 
					
						
							|  |  |  |         return | 
					
						
							|  |  |  |     if not data: | 
					
						
							|  |  |  |         # Empty files are okay | 
					
						
							|  |  |  |         return | 
					
						
							|  |  |  |     # Do checks | 
					
						
							|  |  |  |     lineno = 0 | 
					
						
							|  |  |  |     for lineno, line in enumerate(data.split('\n')): | 
					
						
							| 
									
										
										
										
											2018-07-26 16:00:39 -04:00
										 |  |  |         # Verify line is valid utf-8 | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             line = line.decode('utf-8') | 
					
						
							|  |  |  |         except UnicodeDecodeError: | 
					
						
							| 
									
										
										
										
											2018-08-27 13:21:15 -04:00
										 |  |  |             report_error(filename, lineno, "Found non utf-8 character") | 
					
						
							| 
									
										
										
										
											2018-07-26 16:00:39 -04:00
										 |  |  |             continue | 
					
						
							| 
									
										
										
										
											2018-06-28 13:00:54 -04:00
										 |  |  |         # Check for control characters | 
					
						
							|  |  |  |         for c in line: | 
					
						
							| 
									
										
										
										
											2018-07-27 12:55:41 -04:00
										 |  |  |             if unicodedata.category(c).startswith('C'): | 
					
						
							| 
									
										
										
										
											2018-06-28 13:00:54 -04:00
										 |  |  |                 char_name = repr(c) | 
					
						
							| 
									
										
										
										
											2018-07-27 12:55:41 -04:00
										 |  |  |                 if c == '\t': | 
					
						
							| 
									
										
										
										
											2018-06-28 13:00:54 -04:00
										 |  |  |                     if os.path.basename(filename).lower() == 'makefile': | 
					
						
							|  |  |  |                         continue | 
					
						
							|  |  |  |                     char_name = 'tab' | 
					
						
							|  |  |  |                 report_error(filename, lineno, "Invalid %s character" % ( | 
					
						
							|  |  |  |                     char_name,)) | 
					
						
							|  |  |  |                 break | 
					
						
							|  |  |  |         # Check for trailing space | 
					
						
							|  |  |  |         if line.endswith(' '): | 
					
						
							| 
									
										
										
										
											2018-08-27 13:21:15 -04:00
										 |  |  |             report_error(filename, lineno, "Line has trailing spaces") | 
					
						
							| 
									
										
										
										
											2018-06-28 13:00:54 -04:00
										 |  |  |     if not data.endswith('\n'): | 
					
						
							|  |  |  |         report_error(filename, lineno, "No newline at end of file") | 
					
						
							|  |  |  |     if data.endswith('\n\n'): | 
					
						
							|  |  |  |         report_error(filename, lineno, "Extra newlines at end of file") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def main(): | 
					
						
							|  |  |  |     files = sys.argv[1:] | 
					
						
							|  |  |  |     for filename in files: | 
					
						
							|  |  |  |         check_file(filename) | 
					
						
							|  |  |  |     if HaveError: | 
					
						
							| 
									
										
										
										
											2018-08-27 13:21:15 -04:00
										 |  |  |         sys.stderr.write("\n\n") | 
					
						
							| 
									
										
										
										
											2018-06-28 13:00:54 -04:00
										 |  |  |         sys.exit(-1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if __name__ == '__main__': | 
					
						
							|  |  |  |     main() |