from __future__ import print_function
import os.path

def fix_source_eol( path, is_dry_run = True, verbose = True, eol = '\n' ):
    """Makes sure that all sources have the specified eol sequence (default: unix)."""
    if not os.path.isfile( path ):
        raise ValueError( 'Path "%s" is not a file' % path )
    try:
        f = open(path, 'rb')
    except IOError as msg:
        print("%s: I/O Error: %s" % (file, str(msg)), file=sys.stderr)
        return False
    try:
        raw_lines = f.readlines()
    finally:
        f.close()
    fixed_lines = [line.rstrip('\r\n') + eol for line in raw_lines]
    if raw_lines != fixed_lines:
        print('%s =>' % path, end=' ')
        if not is_dry_run:
            f = open(path, "wb")
            try:
                f.writelines(fixed_lines)
            finally:
                f.close()
        if verbose:
            print(is_dry_run and ' NEED FIX' or ' FIXED')
    return True
##    
##    
##
##def _do_fix( is_dry_run = True ):
##    from waftools import antglob
##    python_sources = antglob.glob( '.',
##        includes = '**/*.py **/wscript **/wscript_build',
##        excludes = antglob.default_excludes + './waf.py',
##        prune_dirs = antglob.prune_dirs + 'waf-* ./build' )
##    for path in python_sources:
##        _fix_python_source( path, is_dry_run )
##
##    cpp_sources = antglob.glob( '.',
##        includes = '**/*.cpp **/*.h **/*.inl',
##        prune_dirs = antglob.prune_dirs + 'waf-* ./build' )
##    for path in cpp_sources:
##        _fix_source_eol( path, is_dry_run )
##
##
##def dry_fix(context):
##    _do_fix( is_dry_run = True )
##
##def fix(context):
##    _do_fix( is_dry_run = False )
##
##def shutdown():
##    pass
##
##def check(context):
##    # Unit tests are run when "check" target is used
##    ut = UnitTest.unit_test()
##    ut.change_to_testfile_dir = True
##    ut.want_to_see_test_output = True
##    ut.want_to_see_test_error = True
##    ut.run()
##    ut.print_results()
