12eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenbergerfrom __future__ import print_function 22eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenbergerimport os.path 32eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger 42eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenbergerdef fix_source_eol( path, is_dry_run = True, verbose = True, eol = '\n' ): 52eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger """Makes sure that all sources have the specified eol sequence (default: unix).""" 62eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger if not os.path.isfile( path ): 72eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger raise ValueError( 'Path "%s" is not a file' % path ) 82eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger try: 92eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger f = open(path, 'rb') 102eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger except IOError as msg: 112eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger print("%s: I/O Error: %s" % (file, str(msg)), file=sys.stderr) 122eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger return False 132eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger try: 142eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger raw_lines = f.readlines() 152eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger finally: 162eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger f.close() 172eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger fixed_lines = [line.rstrip('\r\n') + eol for line in raw_lines] 182eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger if raw_lines != fixed_lines: 192eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger print('%s =>' % path, end=' ') 202eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger if not is_dry_run: 212eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger f = open(path, "wb") 222eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger try: 232eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger f.writelines(fixed_lines) 242eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger finally: 252eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger f.close() 262eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger if verbose: 272eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger print(is_dry_run and ' NEED FIX' or ' FIXED') 282eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger return True 292eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger## 302eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger## 312eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger## 322eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger##def _do_fix( is_dry_run = True ): 332eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger## from waftools import antglob 342eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger## python_sources = antglob.glob( '.', 352eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger## includes = '**/*.py **/wscript **/wscript_build', 362eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger## excludes = antglob.default_excludes + './waf.py', 372eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger## prune_dirs = antglob.prune_dirs + 'waf-* ./build' ) 382eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger## for path in python_sources: 392eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger## _fix_python_source( path, is_dry_run ) 402eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger## 412eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger## cpp_sources = antglob.glob( '.', 422eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger## includes = '**/*.cpp **/*.h **/*.inl', 432eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger## prune_dirs = antglob.prune_dirs + 'waf-* ./build' ) 442eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger## for path in cpp_sources: 452eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger## _fix_source_eol( path, is_dry_run ) 462eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger## 472eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger## 482eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger##def dry_fix(context): 492eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger## _do_fix( is_dry_run = True ) 502eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger## 512eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger##def fix(context): 522eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger## _do_fix( is_dry_run = False ) 532eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger## 542eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger##def shutdown(): 552eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger## pass 562eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger## 572eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger##def check(context): 582eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger## # Unit tests are run when "check" target is used 592eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger## ut = UnitTest.unit_test() 602eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger## ut.change_to_testfile_dir = True 612eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger## ut.want_to_see_test_output = True 622eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger## ut.want_to_see_test_error = True 632eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger## ut.run() 642eb3b4d7ea1a3cbb0f8775de3b6d92c0a6152f9fDerek Sollenberger## ut.print_results() 65