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, msg:
        print >> sys.stderr, "%s: I/O Error: %s" % (file, str(msg))
        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,
        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()
