# Copyright 2010 Baptiste Lepilleur and The JsonCpp Authors
# Distributed under MIT license, or public domain if desired and
# recognized in your jurisdiction.
# See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE

from __future__ import print_function
import os.path
import sys

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()
