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