#!/usr/bin/env python
#coding=utf-8

'''
Remove tailing whitespaces and ensures one and only one empty ending line.
'''

import os, re

def scan(*dirs, **kwargs):
  files = []
  extensions = kwargs['extensions'] if kwargs.has_key('extensions') else None
  excludes = kwargs['excludes'] if kwargs.has_key('excludes') else []
  for top in dirs:
    for root, dirnames, filenames in os.walk(top):
      dirnames = [i for i in dirnames if i in excludes]
      for f in filenames:
        if f in excludes:
          continue
        ext = os.path.splitext(f)[1].lower()
        if extensions is None or ext in extensions:
          files.append(os.path.join(root, f))
  return files

def fixone(src):
  lines = open(src, 'r').readlines()

  trimed = []
  for line in lines:
    trimed.append(re.sub('\s+$', '', line))

  while len(trimed) > 1 and not trimed[-1]:
    trimed.pop()
  trimed.append('')

  with open(src, 'w') as f:
    for line in trimed:
      f.write('%s\n' % line)


def lint(root):
  print('Checking tailing whitespaces in: %s' % root)
  dirs = [
    os.path.join(root, 'cocos'),
    os.path.join(root, 'extensions'),
    os.path.join(root, 'templates'),
    os.path.join(root, 'tests'),
    os.path.join(root, 'tools', 'simulator')
  ]

  files = scan(*dirs, extensions=['.c', '.cpp', '.h', '.hpp', '.m', '.mm', '.java'])
  for f in files:
    print(f)
    fixone(f)


def main():
  default_root = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..'))
  lint(default_root)

main()

[(15, 'os.walk', 'os.walk', False, 'import os, re\n'), (44, 'os.path.join', 'os.path.join', False, 'import os, re\n'), (45, 'os.path.join', 'os.path.join', False, 'import os, re\n'), (46, 'os.path.join', 'os.path.join', False, 'import os, re\n'), (47, 'os.path.join', 'os.path.join', False, 'import os, re\n'), (48, 'os.path.join', 'os.path.join', False, 'import os, re\n'), (30, 're.sub', 're.sub', False, 'import os, re\n'), (58, 'os.path.dirname', 'os.path.dirname', False, 'import os, re\n'), (22, 'os.path.join', 'os.path.join', False, 'import os, re\n'), (20, 'os.path.splitext', 'os.path.splitext', False, 'import os, re\n')]