/ test / lint / lint-spelling.py
lint-spelling.py
 1  #!/usr/bin/env python3
 2  #
 3  # Copyright (c) 2022 The Bitcoin Core developers
 4  # Distributed under the MIT software license, see the accompanying
 5  # file COPYING or http://www.opensource.org/licenses/mit-license.php.
 6  
 7  """
 8  Warn in case of spelling errors.
 9  Note: Will exit successfully regardless of spelling errors.
10  """
11  
12  from subprocess import check_output, STDOUT, CalledProcessError
13  
14  from lint_ignore_dirs import SHARED_EXCLUDED_SUBTREES
15  
16  IGNORE_WORDS_FILE = 'test/lint/spelling.ignore-words.txt'
17  FILES_ARGS = ['git', 'ls-files', '--', ":(exclude)build-aux/m4/", ":(exclude)contrib/seeds/*.txt", ":(exclude)depends/", ":(exclude)doc/release-notes/", ":(exclude)src/qt/locale/", ":(exclude)src/qt/*.qrc", ":(exclude)contrib/guix/patches"]
18  FILES_ARGS += [f":(exclude){dir}" for dir in SHARED_EXCLUDED_SUBTREES]
19  
20  
21  def check_codespell_install():
22      try:
23          check_output(["codespell", "--version"])
24      except FileNotFoundError:
25          print("Skipping spell check linting since codespell is not installed.")
26          exit(0)
27  
28  
29  def main():
30      check_codespell_install()
31  
32      files = check_output(FILES_ARGS).decode("utf-8").splitlines()
33      codespell_args = ['codespell', '--check-filenames', '--disable-colors', '--quiet-level=7', '--ignore-words={}'.format(IGNORE_WORDS_FILE)] + files
34  
35      try:
36          check_output(codespell_args, stderr=STDOUT)
37      except CalledProcessError as e:
38          print(e.output.decode("utf-8"), end="")
39          print('^ Warning: codespell identified likely spelling errors. Any false positives? Add them to the list of ignored words in {}'.format(IGNORE_WORDS_FILE))
40  
41  
42  if __name__ == "__main__":
43      main()