123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- # @file FormatDosFiles.py
- # This script format the source files to follow dos style.
- # It supports Python2.x and Python3.x both.
- #
- # Copyright (c) 2018, Intel Corporation. All rights reserved.<BR>
- #
- # SPDX-License-Identifier: BSD-2-Clause-Patent
- #
- #
- # Import Modules
- #
- from __future__ import print_function
- import argparse
- import os
- import os.path
- import re
- import sys
- import copy
- __prog__ = 'FormatDosFiles'
- __version__ = '%s Version %s' % (__prog__, '0.10 ')
- __copyright__ = 'Copyright (c) 2018-2019, Intel Corporation. All rights reserved.'
- __description__ = 'Convert source files to meet the EDKII C Coding Standards Specification.\n'
- DEFAULT_EXT_LIST = ['.h', '.c', '.nasm', '.nasmb', '.asm', '.S', '.inf', '.dec', '.dsc', '.fdf', '.uni', '.asl', '.aslc', '.vfr', '.idf', '.txt', '.bat', '.py']
- #For working in python2 and python3 environment, re pattern should use binary string, which is bytes type in python3.
- #Because in python3,read from file in binary mode will return bytes type,and in python3 bytes type can not be mixed with str type.
- def FormatFile(FilePath, Args):
- with open(FilePath, 'rb') as Fd:
- Content = Fd.read()
- # Convert the line endings to CRLF
- Content = re.sub(br'([^\r])\n', br'\1\r\n', Content)
- Content = re.sub(br'^\n', br'\r\n', Content, flags=re.MULTILINE)
- # Add a new empty line if the file is not end with one
- Content = re.sub(br'([^\r\n])$', br'\1\r\n', Content)
- # Remove trailing white spaces
- Content = re.sub(br'[ \t]+(\r\n)', br'\1', Content, flags=re.MULTILINE)
- # Replace '\t' with two spaces
- Content = re.sub(b'\t', b' ', Content)
- with open(FilePath, 'wb') as Fd:
- Fd.write(Content)
- if not Args.Quiet:
- print(FilePath)
- def FormatFilesInDir(DirPath, ExtList, Args):
- FileList = []
- ExcludeDir = DirPath
- for DirPath, DirNames, FileNames in os.walk(DirPath):
- if Args.Exclude:
- DirNames[:] = [d for d in DirNames if d not in Args.Exclude]
- FileNames[:] = [f for f in FileNames if f not in Args.Exclude]
- Continue = False
- for Path in Args.Exclude:
- Path = Path.strip('\\').strip('/')
- if not os.path.isdir(Path) and not os.path.isfile(Path):
- Path = os.path.join(ExcludeDir, Path)
- if os.path.isdir(Path) and Path.endswith(DirPath):
- DirNames[:] = []
- Continue = True
- elif os.path.isfile(Path):
- FilePaths = FileNames
- for ItemPath in FilePaths:
- FilePath = os.path.join(DirPath, ItemPath)
- if Path.endswith(FilePath):
- FileNames.remove(ItemPath)
- if Continue:
- continue
- for FileName in [f for f in FileNames if any(f.endswith(ext) for ext in ExtList)]:
- FileList.append(os.path.join(DirPath, FileName))
- for File in FileList:
- FormatFile(File, Args)
- if __name__ == "__main__":
- parser = argparse.ArgumentParser(prog=__prog__, description=__description__ + __copyright__, conflict_handler = 'resolve')
- parser.add_argument('Path', nargs='+',
- help='the path for files to be converted.It could be directory or file path.')
- parser.add_argument('--version', action='version', version=__version__)
- parser.add_argument('--append-extensions', dest='AppendExt', nargs='+',
- help='append file extensions filter to default extensions. (Example: .txt .c .h)')
- parser.add_argument('--override-extensions', dest='OverrideExt', nargs='+',
- help='override file extensions filter on default extensions. (Example: .txt .c .h)')
- parser.add_argument('-v', '--verbose', dest='Verbose', action='store_true',
- help='increase output messages')
- parser.add_argument('-q', '--quiet', dest='Quiet', action='store_true',
- help='reduce output messages')
- parser.add_argument('--debug', dest='Debug', type=int, metavar='[0-9]', choices=range(0, 10), default=0,
- help='set debug level')
- parser.add_argument('--exclude', dest='Exclude', nargs='+', help="directory name or file name which will be excluded")
- args = parser.parse_args()
- DefaultExt = copy.copy(DEFAULT_EXT_LIST)
- if args.OverrideExt is not None:
- DefaultExt = args.OverrideExt
- if args.AppendExt is not None:
- DefaultExt = list(set(DefaultExt + args.AppendExt))
- for Path in args.Path:
- if not os.path.exists(Path):
- print("not exists path: {0}".format(Path))
- sys.exit(1)
- if os.path.isdir(Path):
- FormatFilesInDir(Path, DefaultExt, args)
- elif os.path.isfile(Path):
- FormatFile(Path, args)
|