diff options
| author | Akaash Suresh <[email protected]> | 2020-02-22 22:57:19 -0600 | 
|---|---|---|
| committer | GitHub <[email protected]> | 2020-02-22 20:57:19 -0800 | 
| commit | b353028ea5e0ac7b69e7fed4f224c7cb07015ec9 (patch) | |
| tree | b090b1907dff0b47de08d24002e3bcf72f92f8f8 /lib/python/qmk/cli | |
| parent | eb9c2429c69cf034fb3938f0533d15457a2d7820 (diff) | |
| download | qmk_firmware-b353028ea5e0ac7b69e7fed4f224c7cb07015ec9.tar.gz qmk_firmware-b353028ea5e0ac7b69e7fed4f224c7cb07015ec9.zip | |
New functionality for cformat (#7893)0.7.165
Fixing complexity
remove lambda
PR review fixes #1
Removing unneccesary string substitution
Handle -a and specified files
Complexity rewrite, use pathlib
Diffstat (limited to 'lib/python/qmk/cli')
| -rw-r--r-- | lib/python/qmk/cli/cformat.py | 65 | 
1 files changed, 42 insertions, 23 deletions
| diff --git a/lib/python/qmk/cli/cformat.py b/lib/python/qmk/cli/cformat.py index de55218ae9..7e3a91dcf0 100644 --- a/lib/python/qmk/cli/cformat.py +++ b/lib/python/qmk/cli/cformat.py @@ -1,16 +1,14 @@  """Format C code according to QMK's style.  """ -import os  import subprocess  from shutil import which  from milc import cli +import qmk.path [email protected]('files', nargs='*', arg_only=True, help='Filename(s) to format.') [email protected]("Format C code according to QMK's style.") -def cformat(cli): -    """Format C code according to QMK's style. +def cformat_run(files, all_files): +    """Spawn clang-format subprocess with proper arguments      """      # Determine which version of clang-format to use      clang_format = ['clang-format', '-i'] @@ -19,27 +17,48 @@ def cformat(cli):          if which(binary):              clang_format[0] = binary              break - -    # Find the list of files to format -    if cli.args.files: -        cli.args.files = [os.path.join(os.environ['ORIG_CWD'], file) for file in cli.args.files] -    else: -        ignores = ['tmk_core/protocol/usb_hid', 'quantum/template'] -        for dir in ['drivers', 'quantum', 'tests', 'tmk_core']: -            for dirpath, dirnames, filenames in os.walk(dir): -                if any(i in dirpath for i in ignores): -                    dirnames.clear() -                    continue - -                for name in filenames: -                    if name.endswith(('.c', '.h', '.cpp')): -                        cli.args.files.append(os.path.join(dirpath, name)) - -    # Run clang-format on the files we've found      try: -        subprocess.run(clang_format + cli.args.files, check=True) +        if not files: +            cli.log.warn('No changes detected. Use "qmk cformat -a" to format all files') +            return False +        if files and all_files: +            cli.log.warning('Filenames passed with -a, only formatting: %s', ','.join(cli.args.files)) +        # 3.6+: Can remove the str casting, python will cast implicitly +        subprocess.run(clang_format + [str(file) for file in files], check=True)          cli.log.info('Successfully formatted the C code.')      except subprocess.CalledProcessError:          cli.log.error('Error formatting C code!')          return False + + [email protected]('-a', '--all-files', arg_only=True, action='store_true', help='Format all core files.') [email protected]('-b', '--base-branch', default='origin/master', help='Branch to compare to diffs to.') [email protected]('files', nargs='*', arg_only=True, help='Filename(s) to format.') [email protected]("Format C code according to QMK's style.") +def cformat(cli): +    """Format C code according to QMK's style. +    """ +    # Empty array for files +    files = [] +    # Core directories for formatting +    core_dirs = ['drivers', 'quantum', 'tests', 'tmk_core'] +    ignores = ['tmk_core/protocol/usb_hid', 'quantum/template'] +    # Find the list of files to format +    if cli.args.files: +        files.extend(qmk.path.normpath(file) for file in cli.args.files) +    # If -a is specified +    elif cli.args.all_files: +        all_files = qmk.path.c_source_files(core_dirs) +        # The following statement checks each file to see if the file path is in the ignored directories. +        files.extend(file for file in all_files if not any(i in str(file) for i in ignores)) +    # No files specified & no -a flag +    else: +        base_args = ['git', 'diff', '--name-only', cli.args.base_branch] +        out = subprocess.run(base_args + core_dirs, check=True, stdout=subprocess.PIPE) +        changed_files = filter(None, out.stdout.decode('UTF-8').split('\n')) +        filtered_files = [qmk.path.normpath(file) for file in changed_files if not any(i in file for i in ignores)] +        files.extend(file for file in filtered_files if file.exists() and file.suffix in ['.c', '.h', '.cpp']) + +    # Run clang-format on the files we've found +    cformat_run(files, cli.args.all_files) | 
