| 
									
										
										
										
											2010-03-11 22:53:45 +00:00
										 |  |  | #! /usr/bin/env python3 | 
					
						
							| 
									
										
										
										
											2001-09-02 04:43:30 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | """finddiv - a grep-like tool that looks for division operators.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Usage: finddiv [-l] file_or_directory ... | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | For directory arguments, all files in the directory whose name ends in | 
					
						
							|  |  |  | .py are processed, and subdirectories are processed recursively. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | This actually tokenizes the files to avoid false hits in comments or | 
					
						
							|  |  |  | strings literals. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | By default, this prints all lines containing a / or /= operator, in | 
					
						
							|  |  |  | grep -n style.  With the -l option specified, it prints the filename | 
					
						
							|  |  |  | of files that contain at least one / or /= operator. | 
					
						
							|  |  |  | """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import os | 
					
						
							|  |  |  | import sys | 
					
						
							|  |  |  | import getopt | 
					
						
							|  |  |  | import tokenize | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def main(): | 
					
						
							|  |  |  |     try: | 
					
						
							|  |  |  |         opts, args = getopt.getopt(sys.argv[1:], "lh") | 
					
						
							| 
									
										
										
										
											2007-01-10 16:19:56 +00:00
										 |  |  |     except getopt.error as msg: | 
					
						
							| 
									
										
										
										
											2001-09-02 04:43:30 +00:00
										 |  |  |         usage(msg) | 
					
						
							|  |  |  |         return 2 | 
					
						
							|  |  |  |     if not args: | 
					
						
							|  |  |  |         usage("at least one file argument is required") | 
					
						
							|  |  |  |         return 2 | 
					
						
							|  |  |  |     listnames = 0 | 
					
						
							|  |  |  |     for o, a in opts: | 
					
						
							|  |  |  |         if o == "-h": | 
					
						
							| 
									
										
										
										
											2007-08-03 17:06:41 +00:00
										 |  |  |             print(__doc__) | 
					
						
							| 
									
										
										
										
											2001-09-02 04:43:30 +00:00
										 |  |  |             return | 
					
						
							|  |  |  |         if o == "-l": | 
					
						
							|  |  |  |             listnames = 1 | 
					
						
							|  |  |  |     exit = None | 
					
						
							| 
									
										
										
										
											2003-05-13 18:14:25 +00:00
										 |  |  |     for filename in args: | 
					
						
							|  |  |  |         x = process(filename, listnames) | 
					
						
							| 
									
										
										
										
											2001-09-02 04:43:30 +00:00
										 |  |  |         exit = exit or x | 
					
						
							|  |  |  |     return exit | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def usage(msg): | 
					
						
							|  |  |  |     sys.stderr.write("%s: %s\n" % (sys.argv[0], msg)) | 
					
						
							|  |  |  |     sys.stderr.write("Usage: %s [-l] file ...\n" % sys.argv[0]) | 
					
						
							|  |  |  |     sys.stderr.write("Try `%s -h' for more information.\n" % sys.argv[0]) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-05-13 18:14:25 +00:00
										 |  |  | def process(filename, listnames): | 
					
						
							|  |  |  |     if os.path.isdir(filename): | 
					
						
							|  |  |  |         return processdir(filename, listnames) | 
					
						
							| 
									
										
										
										
											2001-09-02 04:43:30 +00:00
										 |  |  |     try: | 
					
						
							| 
									
										
										
										
											2003-05-13 18:14:25 +00:00
										 |  |  |         fp = open(filename) | 
					
						
							| 
									
										
										
										
											2007-01-10 16:19:56 +00:00
										 |  |  |     except IOError as msg: | 
					
						
							| 
									
										
										
										
											2001-09-02 04:43:30 +00:00
										 |  |  |         sys.stderr.write("Can't open: %s\n" % msg) | 
					
						
							|  |  |  |         return 1 | 
					
						
							| 
									
										
										
										
											2019-03-30 08:33:02 +02:00
										 |  |  |     with fp: | 
					
						
							|  |  |  |         g = tokenize.generate_tokens(fp.readline) | 
					
						
							|  |  |  |         lastrow = None | 
					
						
							|  |  |  |         for type, token, (row, col), end, line in g: | 
					
						
							|  |  |  |             if token in ("/", "/="): | 
					
						
							|  |  |  |                 if listnames: | 
					
						
							|  |  |  |                     print(filename) | 
					
						
							|  |  |  |                     break | 
					
						
							|  |  |  |                 if row != lastrow: | 
					
						
							|  |  |  |                     lastrow = row | 
					
						
							|  |  |  |                     print("%s:%d:%s" % (filename, row, line), end=' ') | 
					
						
							| 
									
										
										
										
											2001-09-02 04:43:30 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def processdir(dir, listnames): | 
					
						
							|  |  |  |     try: | 
					
						
							|  |  |  |         names = os.listdir(dir) | 
					
						
							| 
									
										
										
										
											2012-12-24 19:58:48 +02:00
										 |  |  |     except OSError as msg: | 
					
						
							| 
									
										
										
										
											2001-09-02 04:43:30 +00:00
										 |  |  |         sys.stderr.write("Can't list directory: %s\n" % dir) | 
					
						
							|  |  |  |         return 1 | 
					
						
							|  |  |  |     files = [] | 
					
						
							|  |  |  |     for name in names: | 
					
						
							|  |  |  |         fn = os.path.join(dir, name) | 
					
						
							|  |  |  |         if os.path.normcase(fn).endswith(".py") or os.path.isdir(fn): | 
					
						
							|  |  |  |             files.append(fn) | 
					
						
							| 
									
										
										
										
											2008-01-30 02:55:10 +00:00
										 |  |  |     files.sort(key=os.path.normcase) | 
					
						
							| 
									
										
										
										
											2001-09-02 04:43:30 +00:00
										 |  |  |     exit = None | 
					
						
							|  |  |  |     for fn in files: | 
					
						
							|  |  |  |         x = process(fn, listnames) | 
					
						
							|  |  |  |         exit = exit or x | 
					
						
							|  |  |  |     return exit | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if __name__ == "__main__": | 
					
						
							|  |  |  |     sys.exit(main()) |