diff --git a/clang/tools/clang-format/git-clang-format b/clang/tools/clang-format/git-clang-format --- a/clang/tools/clang-format/git-clang-format +++ b/clang/tools/clang-format/git-clang-format @@ -137,10 +137,15 @@ if opts.verbose >= 1: ignored_files = set(changed_lines) filter_by_extension(changed_lines, opts.extensions.lower().split(',')) + # The computed diff outputs absolute paths, so we must cd before accessing + # those files. + cd_to_toplevel() + filter_symlinks(changed_lines) if opts.verbose >= 1: ignored_files.difference_update(changed_lines) if ignored_files: - print('Ignoring changes in the following files (wrong extension):') + print( + 'Ignoring changes in the following files (wrong extension or symlink):') for filename in ignored_files: print(' %s' % filename) if changed_lines: @@ -151,9 +156,6 @@ if opts.verbose >= 0: print('no modified files to format') return - # The computed diff outputs absolute paths, so we must cd before accessing - # those files. - cd_to_toplevel() if len(commits) > 1: old_tree = commits[1] new_tree = run_clang_format_and_save_to_tree(changed_lines, @@ -337,6 +339,13 @@ del dictionary[filename] +def filter_symlinks(dictionary): + """Delete every key in `dictionary` that is a symlink.""" + for filename in list(dictionary.keys()): + if os.path.islink(filename): + del dictionary[filename] + + def cd_to_toplevel(): """Change to the top level of the git repository.""" toplevel = run('git', 'rev-parse', '--show-toplevel')