From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 4C65DC77B7D for ; Mon, 15 May 2023 21:12:55 +0000 (UTC) Received: by smtp.kernel.org (Postfix) id 3334CC433EF; Mon, 15 May 2023 21:12:55 +0000 (UTC) Received: from mail-lf1-f50.google.com (mail-lf1-f50.google.com [209.85.167.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.kernel.org (Postfix) with ESMTPS id 9C784C433D2; Mon, 15 May 2023 21:12:50 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 smtp.kernel.org 9C784C433D2 Authentication-Results: smtp.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.kernel.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-lf1-f50.google.com with SMTP id 2adb3069b0e04-4f14ec8d72aso13281739e87.1; Mon, 15 May 2023 14:12:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1684185168; x=1686777168; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=oH108Z8xNSu/MgmUJncs6jFAtX6B3zS2U0cAxVhwJAM=; b=ohJ0eAxeucmMwfySY5wqY5RoKtexlW6bL4TAew/byfqDHNjUVRyYptM8RCkRFsgjRh klHdxuqdjFQktNkLgLaGoNRpCJBOa89kvj7qyq8Otqjaok5jOxw7I45CAMJzNciGjPrm DTMPD0IQLdHkhdO3NEpCmUKhtrbzjJtHCS+k/owxlDrhL5I8/gwAM4T0kmnQJ1ZWDU4t Mwvf1CPhiSNRw9r11+/cIzyWUxtt/n5YDsOC4gHLP/WeBT+QOInYU1JpeLKR0CLrY1Kj H+VZaleMAYI6I7v1mo0sh00Qn26NUOTQdEH1l0LKSCbLgIVGryhhfrQXvfzcAjJ7jcXl 2iGg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1684185168; x=1686777168; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=oH108Z8xNSu/MgmUJncs6jFAtX6B3zS2U0cAxVhwJAM=; b=Ecy2jmmm99JYWLxVpACQUYUvHoPAgshYIWtzj1xSxR0OMXeR9QQEHD0TgO/M76Ufzf EfvbEDR10BXlsDEUu1UT8FfyOMwA8F8vucBg3eAF4fbsp37STonFgWM3zgtU08XP13sM +VZZ3YjLiIypxtzFAHOvAjA8blR1hLlys5vy8uKpGYFR/i0MG+G+3M/tP8MMS9Luc7OA 3gR2YRxw4vFeZFKrs3Cu9KeBZtDO9Tbh2iZp3bFgPI0e8U8v9tUqNDzZMvdIcqh6B5sC 69pGlwJegijMO9+pF+iggV4DRKCloCiU+IialVM9vefpj+P9+kIWibKyE0t26o5yFCVi rrqA== X-Gm-Message-State: AC+VfDx1hPbjWgoYu1EchiKWBG0O8qVzhX8Xr2GV9g1wG7/xEi2OhuN5 U+JDDZDuFNbE+o8jIz739+NnOQtiG86MnF+hh3j52u+V X-Google-Smtp-Source: ACHHUZ5TQtLm4w1zomBPWtg5livCUfW9qUaChpqX9gLrI2hJFuJlMY9gzdUTDpahjvsiOe3VT7Ak1ylon2zyCj67E9c= X-Received: by 2002:ac2:4c08:0:b0:4ee:8ff3:c981 with SMTP id t8-20020ac24c08000000b004ee8ff3c981mr7204019lfq.10.1684185167622; Mon, 15 May 2023 14:12:47 -0700 (PDT) MIME-Version: 1.0 References: <20230510003751.84732-1-bryanhundven@gmail.com> In-Reply-To: From: Bryan Hundven Date: Mon, 15 May 2023 14:12:36 -0700 Message-ID: Subject: Re: [PATCH] Clean up check_whence.py style To: Josh Boyer List-Id: Cc: linux-firmware@kernel.org Content-Type: multipart/alternative; boundary="000000000000a6f7df05fbc1eabc" --000000000000a6f7df05fbc1eabc Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Mon, May 15, 2023 at 11:33=E2=80=AFAM Josh Boyer wr= ote: > On Tue, May 9, 2023 at 8:38=E2=80=AFPM Bryan Hundven > wrote: > > > > Use flake8, pylint, and black to clean up python code style for > > check_whence.py and potentially any future python scripts. > > > > Signed-off-by: Bryan Hundven > > Ironically, this patch actually causes check_whence.py to fail after > it is applied. > > [jwboyer@vader linux-firmware]$ ./check_whence.py > E: .flake8 not listed in WHENCE > E: .pylintrc not listed in WHENCE > [jwboyer@vader linux-firmware]$ > > Can you fix this up? > I missed that, I updated the change, but it didn't respond to this thread, sorry about that. -Bryan > > josh > > > --- > > .flake8 | 2 + > > .pylintrc | 630 ++++++++++++++++++++++++++++++++++++++++++++++++ > > check_whence.py | 84 ++++--- > > 3 files changed, 689 insertions(+), 27 deletions(-) > > create mode 100644 .flake8 > > create mode 100644 .pylintrc > > > > diff --git a/.flake8 b/.flake8 > > new file mode 100644 > > index 0000000..7da1f96 > > --- /dev/null > > +++ b/.flake8 > > @@ -0,0 +1,2 @@ > > +[flake8] > > +max-line-length =3D 100 > > diff --git a/.pylintrc b/.pylintrc > > new file mode 100644 > > index 0000000..202ec02 > > --- /dev/null > > +++ b/.pylintrc > > @@ -0,0 +1,630 @@ > > +[MAIN] > > + > > +# Analyse import fallback blocks. This can be used to support both > Python 2 and > > +# 3 compatible code, which means that the block might have code that > exists > > +# only in one or another interpreter, leading to false positives when > analysed. > > +analyse-fallback-blocks=3Dno > > + > > +# Clear in-memory caches upon conclusion of linting. Useful if running > pylint > > +# in a server-like mode. > > +clear-cache-post-run=3Dno > > + > > +# Load and enable all available extensions. Use --list-extensions to > see a list > > +# all available extensions. > > +#enable-all-extensions=3D > > + > > +# In error mode, messages with a category besides ERROR or FATAL are > > +# suppressed, and no reports are done by default. Error mode is > compatible with > > +# disabling specific errors. > > +#errors-only=3D > > + > > +# Always return a 0 (non-error) status code, even if lint errors are > found. > > +# This is primarily useful in continuous integration scripts. > > +#exit-zero=3D > > + > > +# A comma-separated list of package or module names from where C > extensions may > > +# be loaded. Extensions are loading into the active Python interpreter > and may > > +# run arbitrary code. > > +extension-pkg-allow-list=3D > > + > > +# A comma-separated list of package or module names from where C > extensions may > > +# be loaded. Extensions are loading into the active Python interpreter > and may > > +# run arbitrary code. (This is an alternative name to > extension-pkg-allow-list > > +# for backward compatibility.) > > +extension-pkg-whitelist=3D > > + > > +# Return non-zero exit code if any of these messages/categories are > detected, > > +# even if score is above --fail-under value. Syntax same as enable. > Messages > > +# specified are enabled, while categories only check already-enabled > messages. > > +fail-on=3D > > + > > +# Specify a score threshold under which the program will exit with > error. > > +fail-under=3D10 > > + > > +# Interpret the stdin as a python script, whose filename needs to be > passed as > > +# the module_or_package argument. > > +#from-stdin=3D > > + > > +# Files or directories to be skipped. They should be base names, not > paths. > > +ignore=3DCVS > > + > > +# Add files or directories matching the regular expressions patterns t= o > the > > +# ignore-list. The regex matches against paths and can be in Posix or > Windows > > +# format. Because '\\' represents the directory delimiter on Windows > systems, > > +# it can't be used as an escape character. > > +ignore-paths=3D > > + > > +# Files or directories matching the regular expression patterns are > skipped. > > +# The regex matches against base names, not paths. The default value > ignores > > +# Emacs file locks > > +ignore-patterns=3D^\.# > > + > > +# List of module names for which member attributes should not be check= ed > > +# (useful for modules/projects where namespaces are manipulated during > runtime > > +# and thus existing member attributes cannot be deduced by static > analysis). It > > +# supports qualified module names, as well as Unix pattern matching. > > +ignored-modules=3D > > + > > +# Python code to execute, usually for sys.path manipulation such as > > +# pygtk.require(). > > +#init-hook=3D > > + > > +# Use multiple processes to speed up Pylint. Specifying 0 will > auto-detect the > > +# number of processors available to use, and will cap the count on > Windows to > > +# avoid hangs. > > +jobs=3D1 > > + > > +# Control the amount of potential inferred values when inferring a > single > > +# object. This can help the performance when dealing with large > functions or > > +# complex, nested conditions. > > +limit-inference-results=3D100 > > + > > +# List of plugins (as comma separated values of python module names) t= o > load, > > +# usually to register additional checkers. > > +load-plugins=3D > > + > > +# Pickle collected data for later comparisons. > > +persistent=3Dyes > > + > > +# Minimum Python version to use for version dependent checks. Will > default to > > +# the version used to run pylint. > > +py-version=3D3.11 > > + > > +# Discover python modules and packages in the file system subtree. > > +recursive=3Dno > > + > > +# Add paths to the list of the source roots. Supports globbing > patterns. The > > +# source root is an absolute path or a path relative to the current > working > > +# directory used to determine a package namespace for modules located > under the > > +# source root. > > +source-roots=3D > > + > > +# When enabled, pylint would attempt to guess common misconfiguration > and emit > > +# user-friendly hints instead of false-positive error messages. > > +suggestion-mode=3Dyes > > + > > +# Allow loading of arbitrary C extensions. Extensions are imported int= o > the > > +# active Python interpreter and may run arbitrary code. > > +unsafe-load-any-extension=3Dno > > + > > +# In verbose mode, extra non-checker-related info will be displayed. > > +#verbose=3D > > + > > + > > +[BASIC] > > + > > +# Naming style matching correct argument names. > > +argument-naming-style=3Dsnake_case > > + > > +# Regular expression matching correct argument names. Overrides > argument- > > +# naming-style. If left empty, argument names will be checked with the > set > > +# naming style. > > +#argument-rgx=3D > > + > > +# Naming style matching correct attribute names. > > +attr-naming-style=3Dsnake_case > > + > > +# Regular expression matching correct attribute names. Overrides > attr-naming- > > +# style. If left empty, attribute names will be checked with the set > naming > > +# style. > > +#attr-rgx=3D > > + > > +# Bad variable names which should always be refused, separated by a > comma. > > +bad-names=3Dfoo, > > + bar, > > + baz, > > + toto, > > + tutu, > > + tata > > + > > +# Bad variable names regexes, separated by a comma. If names match any > regex, > > +# they will always be refused > > +bad-names-rgxs=3D > > + > > +# Naming style matching correct class attribute names. > > +class-attribute-naming-style=3Dany > > + > > +# Regular expression matching correct class attribute names. Overrides > class- > > +# attribute-naming-style. If left empty, class attribute names will be > checked > > +# with the set naming style. > > +#class-attribute-rgx=3D > > + > > +# Naming style matching correct class constant names. > > +class-const-naming-style=3DUPPER_CASE > > + > > +# Regular expression matching correct class constant names. Overrides > class- > > +# const-naming-style. If left empty, class constant names will be > checked with > > +# the set naming style. > > +#class-const-rgx=3D > > + > > +# Naming style matching correct class names. > > +class-naming-style=3DPascalCase > > + > > +# Regular expression matching correct class names. Overrides > class-naming- > > +# style. If left empty, class names will be checked with the set namin= g > style. > > +#class-rgx=3D > > + > > +# Naming style matching correct constant names. > > +const-naming-style=3DUPPER_CASE > > + > > +# Regular expression matching correct constant names. Overrides > const-naming- > > +# style. If left empty, constant names will be checked with the set > naming > > +# style. > > +#const-rgx=3D > > + > > +# Minimum line length for functions/classes that require docstrings, > shorter > > +# ones are exempt. > > +docstring-min-length=3D-1 > > + > > +# Naming style matching correct function names. > > +function-naming-style=3Dsnake_case > > + > > +# Regular expression matching correct function names. Overrides > function- > > +# naming-style. If left empty, function names will be checked with the > set > > +# naming style. > > +#function-rgx=3D > > + > > +# Good variable names which should always be accepted, separated by a > comma. > > +good-names=3Di, > > + j, > > + k, > > + ex, > > + Run, > > + _ > > + > > +# Good variable names regexes, separated by a comma. If names match an= y > regex, > > +# they will always be accepted > > +good-names-rgxs=3D > > + > > +# Include a hint for the correct naming format with invalid-name. > > +include-naming-hint=3Dno > > + > > +# Naming style matching correct inline iteration names. > > +inlinevar-naming-style=3Dany > > + > > +# Regular expression matching correct inline iteration names. Override= s > > +# inlinevar-naming-style. If left empty, inline iteration names will b= e > checked > > +# with the set naming style. > > +#inlinevar-rgx=3D > > + > > +# Naming style matching correct method names. > > +method-naming-style=3Dsnake_case > > + > > +# Regular expression matching correct method names. Overrides > method-naming- > > +# style. If left empty, method names will be checked with the set > naming style. > > +#method-rgx=3D > > + > > +# Naming style matching correct module names. > > +module-naming-style=3Dsnake_case > > + > > +# Regular expression matching correct module names. Overrides > module-naming- > > +# style. If left empty, module names will be checked with the set > naming style. > > +#module-rgx=3D > > + > > +# Colon-delimited sets of names that determine each other's naming > style when > > +# the name regexes allow several styles. > > +name-group=3D > > + > > +# Regular expression which should only match function or class names > that do > > +# not require a docstring. > > +no-docstring-rgx=3D^_ > > + > > +# List of decorators that produce properties, such as > abc.abstractproperty. Add > > +# to this list to register other decorators that produce valid > properties. > > +# These decorators are taken in consideration only for invalid-name. > > +property-classes=3Dabc.abstractproperty > > + > > +# Regular expression matching correct type alias names. If left empty, > type > > +# alias names will be checked with the set naming style. > > +#typealias-rgx=3D > > + > > +# Regular expression matching correct type variable names. If left > empty, type > > +# variable names will be checked with the set naming style. > > +#typevar-rgx=3D > > + > > +# Naming style matching correct variable names. > > +variable-naming-style=3Dsnake_case > > + > > +# Regular expression matching correct variable names. Overrides > variable- > > +# naming-style. If left empty, variable names will be checked with the > set > > +# naming style. > > +#variable-rgx=3D > > + > > + > > +[CLASSES] > > + > > +# Warn about protected attribute access inside special methods > > +check-protected-access-in-special-methods=3Dno > > + > > +# List of method names used to declare (i.e. assign) instance > attributes. > > +defining-attr-methods=3D__init__, > > + __new__, > > + setUp, > > + __post_init__ > > + > > +# List of member names, which should be excluded from the protected > access > > +# warning. > > +exclude-protected=3D_asdict,_fields,_replace,_source,_make,os._exit > > + > > +# List of valid names for the first argument in a class method. > > +valid-classmethod-first-arg=3Dcls > > + > > +# List of valid names for the first argument in a metaclass class > method. > > +valid-metaclass-classmethod-first-arg=3Dmcs > > + > > + > > +[DESIGN] > > + > > +# List of regular expressions of class ancestor names to ignore when > counting > > +# public methods (see R0903) > > +exclude-too-few-public-methods=3D > > + > > +# List of qualified class names to ignore when counting class parents > (see > > +# R0901) > > +ignored-parents=3D > > + > > +# Maximum number of arguments for function / method. > > +max-args=3D5 > > + > > +# Maximum number of attributes for a class (see R0902). > > +max-attributes=3D7 > > + > > +# Maximum number of boolean expressions in an if statement (see R0916)= . > > +max-bool-expr=3D5 > > + > > +# Maximum number of branch for function / method body. > > +max-branches=3D12 > > + > > +# Maximum number of locals for function / method body. > > +max-locals=3D15 > > + > > +# Maximum number of parents for a class (see R0901). > > +max-parents=3D7 > > + > > +# Maximum number of public methods for a class (see R0904). > > +max-public-methods=3D20 > > + > > +# Maximum number of return / yield for function / method body. > > +max-returns=3D6 > > + > > +# Maximum number of statements in function / method body. > > +max-statements=3D50 > > + > > +# Minimum number of public methods for a class (see R0903). > > +min-public-methods=3D2 > > + > > + > > +[EXCEPTIONS] > > + > > +# Exceptions that will emit a warning when caught. > > +overgeneral-exceptions=3Dbuiltins.BaseException,builtins.Exception > > + > > + > > +[FORMAT] > > + > > +# Expected format of line ending, e.g. empty (any line ending), LF or > CRLF. > > +expected-line-ending-format=3D > > + > > +# Regexp for a line that is allowed to be longer than the limit. > > +ignore-long-lines=3D^\s*(# )??$ > > + > > +# Number of spaces of indent required inside a hanging or continued > line. > > +indent-after-paren=3D4 > > + > > +# String used as indentation unit. This is usually " " (4 spaces) o= r > "\t" (1 > > +# tab). > > +indent-string=3D' ' > > + > > +# Maximum number of characters on a single line. > > +max-line-length=3D100 > > + > > +# Maximum number of lines in a module. > > +max-module-lines=3D1000 > > + > > +# Allow the body of a class to be on the same line as the declaration > if body > > +# contains single statement. > > +single-line-class-stmt=3Dno > > + > > +# Allow the body of an if to be on the same line as the test if there > is no > > +# else. > > +single-line-if-stmt=3Dno > > + > > + > > +[IMPORTS] > > + > > +# List of modules that can be imported at any level, not just the top > level > > +# one. > > +allow-any-import-level=3D > > + > > +# Allow explicit reexports by alias from a package __init__. > > +allow-reexport-from-package=3Dno > > + > > +# Allow wildcard imports from modules that define __all__. > > +allow-wildcard-with-all=3Dno > > + > > +# Deprecated modules which should not be used, separated by a comma. > > +deprecated-modules=3D > > + > > +# Output a graph (.gv or any supported image format) of external > dependencies > > +# to the given file (report RP0402 must not be disabled). > > +ext-import-graph=3D > > + > > +# Output a graph (.gv or any supported image format) of all (i.e. > internal and > > +# external) dependencies to the given file (report RP0402 must not be > > +# disabled). > > +import-graph=3D > > + > > +# Output a graph (.gv or any supported image format) of internal > dependencies > > +# to the given file (report RP0402 must not be disabled). > > +int-import-graph=3D > > + > > +# Force import order to recognize a module as part of the standard > > +# compatibility libraries. > > +known-standard-library=3D > > + > > +# Force import order to recognize a module as part of a third party > library. > > +known-third-party=3Denchant > > + > > +# Couples of modules and preferred modules, separated by a comma. > > +preferred-modules=3D > > + > > + > > +[LOGGING] > > + > > +# The type of string formatting that logging methods do. `old` means > using % > > +# formatting, `new` is for `{}` formatting. > > +logging-format-style=3Dold > > + > > +# Logging modules to check that the string format arguments are in > logging > > +# function parameter format. > > +logging-modules=3Dlogging > > + > > + > > +[MESSAGES CONTROL] > > + > > +# Only show warnings with the listed confidence levels. Leave empty to > show > > +# all. Valid levels: HIGH, CONTROL_FLOW, INFERENCE, INFERENCE_FAILURE, > > +# UNDEFINED. > > +confidence=3DHIGH, > > + CONTROL_FLOW, > > + INFERENCE, > > + INFERENCE_FAILURE, > > + UNDEFINED > > + > > +# Disable the message, report, category or checker with the given > id(s). You > > +# can either give multiple identifiers separated by comma (,) or put > this > > +# option multiple times (only on the command line, not in the > configuration > > +# file where it should appear only once). You can also use > "--disable=3Dall" to > > +# disable everything first and then re-enable specific checks. For > example, if > > +# you want to run only the similarities checker, you can use > "--disable=3Dall > > +# --enable=3Dsimilarities". If you want to run only the classes checke= r, > but have > > +# no Warning level messages displayed, use "--disable=3Dall > --enable=3Dclasses > > +# --disable=3DW". > > +disable=3Draw-checker-failed, > > + bad-inline-option, > > + locally-disabled, > > + file-ignored, > > + suppressed-message, > > + useless-suppression, > > + deprecated-pragma, > > + use-symbolic-message-instead > > + > > +# Enable the message, report, category or checker with the given id(s)= . > You can > > +# either give multiple identifier separated by comma (,) or put this > option > > +# multiple time (only on the command line, not in the configuration > file where > > +# it should appear only once). See also the "--disable" option for > examples. > > +enable=3Dc-extension-no-member > > + > > + > > +[METHOD_ARGS] > > + > > +# List of qualified names (i.e., library.method) which require a timeo= ut > > +# parameter e.g. 'requests.api.get,requests.api.post' > > > +timeout-methods=3Drequests.api.delete,requests.api.get,requests.api.head= ,requests.api.options,requests.api.patch, > requests.api.post,requests.api.put,requests.api.request > > + > > + > > +[MISCELLANEOUS] > > + > > +# List of note tags to take in consideration, separated by a comma. > > +notes=3DFIXME, > > + XXX, > > + TODO > > + > > +# Regular expression of note tags to take in consideration. > > +notes-rgx=3D > > + > > + > > +[REFACTORING] > > + > > +# Maximum number of nested blocks for function / method body > > +max-nested-blocks=3D5 > > + > > +# Complete name of functions that never returns. When checking for > > +# inconsistent-return-statements if a never returning function is > called then > > +# it will be considered as an explicit return statement and no message > will be > > +# printed. > > +never-returning-functions=3Dsys.exit,argparse.parse_error > > + > > + > > +[REPORTS] > > + > > +# Python expression which should return a score less than or equal to > 10. You > > +# have access to the variables 'fatal', 'error', 'warning', 'refactor'= , > > +# 'convention', and 'info' which contain the number of messages in eac= h > > +# category, as well as 'statement' which is the total number of > statements > > +# analyzed. This score is used by the global evaluation report (RP0004= ). > > +evaluation=3Dmax(0, 0 if fatal else 10.0 - ((float(5 * error + warning= + > refactor + convention) / statement) * 10)) > > + > > +# Template used to display messages. This is a python new-style format > string > > +# used to format the message information. See doc for all details. > > +msg-template=3D > > + > > +# Set the output format. Available formats are text, parseable, > colorized, json > > +# and msvs (visual studio). You can also give a reporter class, e.g. > > +# mypackage.mymodule.MyReporterClass. > > +#output-format=3D > > + > > +# Tells whether to display a full report or only the messages. > > +reports=3Dno > > + > > +# Activate the evaluation score. > > +score=3Dyes > > + > > + > > +[SIMILARITIES] > > + > > +# Comments are removed from the similarity computation > > +ignore-comments=3Dyes > > + > > +# Docstrings are removed from the similarity computation > > +ignore-docstrings=3Dyes > > + > > +# Imports are removed from the similarity computation > > +ignore-imports=3Dyes > > + > > +# Signatures are removed from the similarity computation > > +ignore-signatures=3Dyes > > + > > +# Minimum lines number of a similarity. > > +min-similarity-lines=3D4 > > + > > + > > +[SPELLING] > > + > > +# Limits count of emitted suggestions for spelling mistakes. > > +max-spelling-suggestions=3D4 > > + > > +# Spelling dictionary name. No available dictionaries : You need to > install > > +# both the python package and the system dependency for enchant to > work.. > > +spelling-dict=3D > > + > > +# List of comma separated words that should be considered directives i= f > they > > +# appear at the beginning of a comment and should not be checked. > > +spelling-ignore-comment-directives=3Dfmt: on,fmt: > off,noqa:,noqa,nosec,isort:skip,mypy: > > + > > +# List of comma separated words that should not be checked. > > +spelling-ignore-words=3D > > + > > +# A path to a file that contains the private dictionary; one word per > line. > > +spelling-private-dict-file=3D > > + > > +# Tells whether to store unknown words to the private dictionary (see > the > > +# --spelling-private-dict-file option) instead of raising a message. > > +spelling-store-unknown-words=3Dno > > + > > + > > +[STRING] > > + > > +# This flag controls whether inconsistent-quotes generates a warning > when the > > +# character used as a quote delimiter is used inconsistently within a > module. > > +check-quote-consistency=3Dno > > + > > +# This flag controls whether the implicit-str-concat should generate a > warning > > +# on implicit string concatenation in sequences defined over several > lines. > > +check-str-concat-over-line-jumps=3Dno > > + > > + > > +[TYPECHECK] > > + > > +# List of decorators that produce context managers, such as > > +# contextlib.contextmanager. Add to this list to register other > decorators that > > +# produce valid context managers. > > +contextmanager-decorators=3Dcontextlib.contextmanager > > + > > +# List of members which are set dynamically and missed by pylint > inference > > +# system, and so shouldn't trigger E1101 when accessed. Python regular > > +# expressions are accepted. > > +generated-members=3D > > + > > +# Tells whether to warn about missing members when the owner of the > attribute > > +# is inferred to be None. > > +ignore-none=3Dyes > > + > > +# This flag controls whether pylint should warn about no-member and > similar > > +# checks whenever an opaque object is returned when inferring. The > inference > > +# can return multiple potential results while evaluating a Python > object, but > > +# some branches might not be evaluated, which results in partial > inference. In > > +# that case, it might be useful to still emit no-member and other > checks for > > +# the rest of the inferred objects. > > +ignore-on-opaque-inference=3Dyes > > + > > +# List of symbolic message names to ignore for Mixin members. > > +ignored-checks-for-mixins=3Dno-member, > > + not-async-context-manager, > > + not-context-manager, > > + attribute-defined-outside-init > > + > > +# List of class names for which member attributes should not be checke= d > (useful > > +# for classes with dynamically set attributes). This supports the use = of > > +# qualified names. > > > +ignored-classes=3Doptparse.Values,thread._local,_thread._local,argparse.= Namespace > > + > > +# Show a hint with possible names when a member name was not found. Th= e > aspect > > +# of finding the hint is based on edit distance. > > +missing-member-hint=3Dyes > > + > > +# The minimum edit distance a name should have in order to be > considered a > > +# similar match for a missing member name. > > +missing-member-hint-distance=3D1 > > + > > +# The total number of similar names that should be taken in > consideration when > > +# showing a hint for a missing member. > > +missing-member-max-choices=3D1 > > + > > +# Regex pattern to define which classes are considered mixins. > > +mixin-class-rgx=3D.*[Mm]ixin > > + > > +# List of decorators that change the signature of a decorated function= . > > +signature-mutators=3D > > + > > + > > +[VARIABLES] > > + > > +# List of additional names supposed to be defined in builtins. Remembe= r > that > > +# you should avoid defining new builtins when possible. > > +additional-builtins=3D > > + > > +# Tells whether unused global variables should be treated as a > violation. > > +allow-global-unused-variables=3Dyes > > + > > +# List of names allowed to shadow builtins > > +allowed-redefined-builtins=3D > > + > > +# List of strings which can identify a callback function by name. A > callback > > +# name must start or end with one of those strings. > > +callbacks=3Dcb_, > > + _cb > > + > > +# A regular expression matching the name of dummy variables (i.e. > expected to > > +# not be used). > > > +dummy-variables-rgx=3D_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignored_= |^unused_ > > + > > +# Argument names that match this expression will be ignored. > > +ignored-argument-names=3D_.*|^ignored_|^unused_ > > + > > +# Tells whether we should check for unused import in __init__ files. > > +init-import=3Dno > > + > > +# List of qualified module names which can have objects that can > redefine > > +# builtins. > > > +redefining-builtins-modules=3Dsix.moves,past.builtins,future.builtins,bu= iltins,io > > diff --git a/check_whence.py b/check_whence.py > > index 711be36..4dfda90 100755 > > --- a/check_whence.py > > +++ b/check_whence.py > > @@ -1,73 +1,102 @@ > > -#!/usr/bin/python3 > > +#!/usr/bin/env python3 > > +""" check_whence """ > > > > -import os, re, sys > > +import os > > +import re > > +import sys > > from io import open > > > > + > > def list_whence(): > > - with open('WHENCE', encoding=3D'utf-8') as whence: > > + """ > > + list_whence > > + """ > > + with open("WHENCE", encoding=3D"utf-8") as whence: > > for line in whence: > > match =3D re.match(r'(?:File|Source):\s*"(.*)"', line) > > if match: > > yield match.group(1) > > continue > > - match =3D re.match(r'(?:File|Source):\s*(\S*)', line) > > + match =3D re.match(r"(?:File|Source):\s*(\S*)", line) > > if match: > > yield match.group(1) > > continue > > - match =3D re.match(r'Licen[cs]e: (?:.*\bSee (.*) for > details\.?|(\S*))\n', > > - line) > > + match =3D re.match( > > + r"Licen[cs]e: (?:.*\bSee (.*) for details\.?|(\S*))\n"= , > line > > + ) > > if match: > > if match.group(1): > > - for name in re.split(r', | and ', match.group(1)): > > + for name in re.split(r", | and ", match.group(1)): > > yield name > > continue > > if match.group(2): > > # Just one word - may or may not be a filename > > - if not re.search(r'unknown|distributable', > match.group(2), > > - re.IGNORECASE): > > + if not re.search( > > + r"unknown|distributable", match.group(2), > re.IGNORECASE > > + ): > > yield match.group(2) > > continue > > > > + > > def list_whence_files(): > > - with open('WHENCE', encoding=3D'utf-8') as whence: > > + """ > > + list_whence_files > > + """ > > + with open("WHENCE", encoding=3D"utf-8") as whence: > > for line in whence: > > - match =3D re.match(r'File:\s*(.*)', line) > > + match =3D re.match(r"File:\s*(.*)", line) > > if match: > > - yield match.group(1).replace("\ ", " ") > > + yield match.group(1).replace(r"\ ", " ") > > continue > > > > + > > def list_git(): > > - with os.popen('git ls-files') as git_files: > > + """ > > + list_git > > + """ > > + with os.popen("git ls-files") as git_files: > > for line in git_files: > > - yield line.rstrip('\n') > > + yield line.rstrip("\n") > > + > > > > def main(): > > + """ > > + main > > + """ > > ret =3D 0 > > whence_list =3D list(list_whence()) > > whence_files =3D list(list_whence_files()) > > - known_files =3D set(name for name in whence_list if not > name.endswith('/')) | \ > > - set(['check_whence.py', 'configure', 'Makefile', > > - 'README', 'copy-firmware.sh', 'WHENCE']) > > - known_prefixes =3D set(name for name in whence_list if > name.endswith('/')) > > + # pylint: disable-next=3Dline-too-long > > + known_files =3D set(name for name in whence_list if not > name.endswith("/")) | set( > > + [ > > + "check_whence.py", > > + "configure", > > + "Makefile", > > + "README", > > + "copy-firmware.sh", > > + "WHENCE", > > + ] > > + ) > > + known_prefixes =3D set(name for name in whence_list if > name.endswith("/")) > > git_files =3D set(list_git()) > > > > - for name in set(name for name in whence_files if > name.endswith('/')): > > - sys.stderr.write('E: %s listed in WHENCE as File, but is > directory\n' % > > - name) > > + for name in set(name for name in whence_files if > name.endswith("/")): > > + sys.stderr.write(f"E: {name} listed in WHENCE as File, but is > directory\n") > > ret =3D 1 > > > > for name in set(fw for fw in whence_files if whence_files.count(fw= ) > > 1): > > - sys.stderr.write('E: %s listed in WHENCE twice\n' % name) > > + sys.stderr.write(f"E: {name} listed in WHENCE twice\n") > > ret =3D 1 > > > > for name in sorted(list(known_files - git_files)): > > - sys.stderr.write('E: %s listed in WHENCE does not exist\n' % > name) > > + sys.stderr.write(f"E: {name} listed in WHENCE does not exist\n= " > % name) > > ret =3D 1 > > > > for name in sorted(list(git_files - known_files)): > > # Ignore subdirectory changelogs and GPG detached signatures > > - if (name.endswith('/ChangeLog') or > > - (name.endswith('.asc') and name[:-4] in known_files)): > > + if name.endswith("/ChangeLog") or ( > > + name.endswith(".asc") and name[:-4] in known_files > > + ): > > continue > > > > # Ignore unknown files in known directories > > @@ -75,9 +104,10 @@ def main(): > > if name.startswith(prefix): > > break > > else: > > - sys.stderr.write('E: %s not listed in WHENCE\n' % name) > > + sys.stderr.write(f"E: {name} not listed in WHENCE\n") > > ret =3D 1 > > return ret > > > > -if __name__ =3D=3D '__main__': > > + > > +if __name__ =3D=3D "__main__": > > sys.exit(main()) > > -- > > 2.40.1 > > > --000000000000a6f7df05fbc1eabc Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable

On Mon, May 15, 2023 at 11:33=E2=80=AFAM = Josh Boyer <jwboyer@kernel.org= > wrote:
On T= ue, May 9, 2023 at 8:38=E2=80=AFPM Bryan Hundven <bryanhundven@gmail.com> wrote:=
>
> Use flake8, pylint, and black to clean up python code style for
> check_whence.py and potentially any future python scripts.
>
> Signed-off-by: Bryan Hundven <bryanhundven@gmail.com>

Ironically, this patch actually causes check_whence.py to fail after
it is applied.

[jwboyer@vader linux-firmware]$ ./check_whence.py
E: .flake8 not listed in WHENCE
E: .pylintrc not listed in WHENCE
[jwboyer@vader linux-firmware]$

Can you fix this up?

I missed that, I u= pdated the change, but it didn't respond to this thread, sorry about th= at.

-Bryan
=C2=A0

josh

> ---
>=C2=A0 .flake8=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0|=C2=A0 =C2=A02 +
>=C2=A0 .pylintrc=C2=A0 =C2=A0 =C2=A0 =C2=A0| 630 ++++++++++++++++++++++= ++++++++++++++++++++++++++
>=C2=A0 check_whence.py |=C2=A0 84 ++++---
>=C2=A0 3 files changed, 689 insertions(+), 27 deletions(-)
>=C2=A0 create mode 100644 .flake8
>=C2=A0 create mode 100644 .pylintrc
>
> diff --git a/.flake8 b/.flake8
> new file mode 100644
> index 0000000..7da1f96
> --- /dev/null
> +++ b/.flake8
> @@ -0,0 +1,2 @@
> +[flake8]
> +max-line-length =3D 100
> diff --git a/.pylintrc b/.pylintrc
> new file mode 100644
> index 0000000..202ec02
> --- /dev/null
> +++ b/.pylintrc
> @@ -0,0 +1,630 @@
> +[MAIN]
> +
> +# Analyse import fallback blocks. This can be used to support both Py= thon 2 and
> +# 3 compatible code, which means that the block might have code that = exists
> +# only in one or another interpreter, leading to false positives when= analysed.
> +analyse-fallback-blocks=3Dno
> +
> +# Clear in-memory caches upon conclusion of linting. Useful if runnin= g pylint
> +# in a server-like mode.
> +clear-cache-post-run=3Dno
> +
> +# Load and enable all available extensions. Use --list-extensions to = see a list
> +# all available extensions.
> +#enable-all-extensions=3D
> +
> +# In error mode, messages with a category besides ERROR or FATAL are<= br> > +# suppressed, and no reports are done by default. Error mode is compa= tible with
> +# disabling specific errors.
> +#errors-only=3D
> +
> +# Always return a 0 (non-error) status code, even if lint errors are = found.
> +# This is primarily useful in continuous integration scripts.
> +#exit-zero=3D
> +
> +# A comma-separated list of package or module names from where C exte= nsions may
> +# be loaded. Extensions are loading into the active Python interprete= r and may
> +# run arbitrary code.
> +extension-pkg-allow-list=3D
> +
> +# A comma-separated list of package or module names from where C exte= nsions may
> +# be loaded. Extensions are loading into the active Python interprete= r and may
> +# run arbitrary code. (This is an alternative name to extension-pkg-a= llow-list
> +# for backward compatibility.)
> +extension-pkg-whitelist=3D
> +
> +# Return non-zero exit code if any of these messages/categories are d= etected,
> +# even if score is above --fail-under value. Syntax same as enable. M= essages
> +# specified are enabled, while categories only check already-enabled = messages.
> +fail-on=3D
> +
> +# Specify a score threshold under which the program will exit with er= ror.
> +fail-under=3D10
> +
> +# Interpret the stdin as a python script, whose filename needs to be = passed as
> +# the module_or_package argument.
> +#from-stdin=3D
> +
> +# Files or directories to be skipped. They should be base names, not = paths.
> +ignore=3DCVS
> +
> +# Add files or directories matching the regular expressions patterns = to the
> +# ignore-list. The regex matches against paths and can be in Posix or= Windows
> +# format. Because '\\' represents the directory delimiter on = Windows systems,
> +# it can't be used as an escape character.
> +ignore-paths=3D
> +
> +# Files or directories matching the regular expression patterns are s= kipped.
> +# The regex matches against base names, not paths. The default value = ignores
> +# Emacs file locks
> +ignore-patterns=3D^\.#
> +
> +# List of module names for which member attributes should not be chec= ked
> +# (useful for modules/projects where namespaces are manipulated durin= g runtime
> +# and thus existing member attributes cannot be deduced by static ana= lysis). It
> +# supports qualified module names, as well as Unix pattern matching.<= br> > +ignored-modules=3D
> +
> +# Python code to execute, usually for sys.path manipulation such as > +# pygtk.require().
> +#init-hook=3D
> +
> +# Use multiple processes to speed up Pylint. Specifying 0 will auto-d= etect the
> +# number of processors available to use, and will cap the count on Wi= ndows to
> +# avoid hangs.
> +jobs=3D1
> +
> +# Control the amount of potential inferred values when inferring a si= ngle
> +# object. This can help the performance when dealing with large funct= ions or
> +# complex, nested conditions.
> +limit-inference-results=3D100
> +
> +# List of plugins (as comma separated values of python module names) = to load,
> +# usually to register additional checkers.
> +load-plugins=3D
> +
> +# Pickle collected data for later comparisons.
> +persistent=3Dyes
> +
> +# Minimum Python version to use for version dependent checks. Will de= fault to
> +# the version used to run pylint.
> +py-version=3D3.11
> +
> +# Discover python modules and packages in the file system subtree. > +recursive=3Dno
> +
> +# Add paths to the list of the source roots. Supports globbing patter= ns. The
> +# source root is an absolute path or a path relative to the current w= orking
> +# directory used to determine a package namespace for modules located= under the
> +# source root.
> +source-roots=3D
> +
> +# When enabled, pylint would attempt to guess common misconfiguration= and emit
> +# user-friendly hints instead of false-positive error messages.
> +suggestion-mode=3Dyes
> +
> +# Allow loading of arbitrary C extensions. Extensions are imported in= to the
> +# active Python interpreter and may run arbitrary code.
> +unsafe-load-any-extension=3Dno
> +
> +# In verbose mode, extra non-checker-related info will be displayed.<= br> > +#verbose=3D
> +
> +
> +[BASIC]
> +
> +# Naming style matching correct argument names.
> +argument-naming-style=3Dsnake_case
> +
> +# Regular expression matching correct argument names. Overrides argum= ent-
> +# naming-style. If left empty, argument names will be checked with th= e set
> +# naming style.
> +#argument-rgx=3D
> +
> +# Naming style matching correct attribute names.
> +attr-naming-style=3Dsnake_case
> +
> +# Regular expression matching correct attribute names. Overrides attr= -naming-
> +# style. If left empty, attribute names will be checked with the set = naming
> +# style.
> +#attr-rgx=3D
> +
> +# Bad variable names which should always be refused, separated by a c= omma.
> +bad-names=3Dfoo,
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 bar,
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 baz,
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 toto,
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 tutu,
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 tata
> +
> +# Bad variable names regexes, separated by a comma. If names match an= y regex,
> +# they will always be refused
> +bad-names-rgxs=3D
> +
> +# Naming style matching correct class attribute names.
> +class-attribute-naming-style=3Dany
> +
> +# Regular expression matching correct class attribute names. Override= s class-
> +# attribute-naming-style. If left empty, class attribute names will b= e checked
> +# with the set naming style.
> +#class-attribute-rgx=3D
> +
> +# Naming style matching correct class constant names.
> +class-const-naming-style=3DUPPER_CASE
> +
> +# Regular expression matching correct class constant names. Overrides= class-
> +# const-naming-style. If left empty, class constant names will be che= cked with
> +# the set naming style.
> +#class-const-rgx=3D
> +
> +# Naming style matching correct class names.
> +class-naming-style=3DPascalCase
> +
> +# Regular expression matching correct class names. Overrides class-na= ming-
> +# style. If left empty, class names will be checked with the set nami= ng style.
> +#class-rgx=3D
> +
> +# Naming style matching correct constant names.
> +const-naming-style=3DUPPER_CASE
> +
> +# Regular expression matching correct constant names. Overrides const= -naming-
> +# style. If left empty, constant names will be checked with the set n= aming
> +# style.
> +#const-rgx=3D
> +
> +# Minimum line length for functions/classes that require docstrings, = shorter
> +# ones are exempt.
> +docstring-min-length=3D-1
> +
> +# Naming style matching correct function names.
> +function-naming-style=3Dsnake_case
> +
> +# Regular expression matching correct function names. Overrides funct= ion-
> +# naming-style. If left empty, function names will be checked with th= e set
> +# naming style.
> +#function-rgx=3D
> +
> +# Good variable names which should always be accepted, separated by a= comma.
> +good-names=3Di,
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0j,
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0k,
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0ex,
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0Run,
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0_
> +
> +# Good variable names regexes, separated by a comma. If names match a= ny regex,
> +# they will always be accepted
> +good-names-rgxs=3D
> +
> +# Include a hint for the correct naming format with invalid-name.
> +include-naming-hint=3Dno
> +
> +# Naming style matching correct inline iteration names.
> +inlinevar-naming-style=3Dany
> +
> +# Regular expression matching correct inline iteration names. Overrid= es
> +# inlinevar-naming-style. If left empty, inline iteration names will = be checked
> +# with the set naming style.
> +#inlinevar-rgx=3D
> +
> +# Naming style matching correct method names.
> +method-naming-style=3Dsnake_case
> +
> +# Regular expression matching correct method names. Overrides method-= naming-
> +# style. If left empty, method names will be checked with the set nam= ing style.
> +#method-rgx=3D
> +
> +# Naming style matching correct module names.
> +module-naming-style=3Dsnake_case
> +
> +# Regular expression matching correct module names. Overrides module-= naming-
> +# style. If left empty, module names will be checked with the set nam= ing style.
> +#module-rgx=3D
> +
> +# Colon-delimited sets of names that determine each other's namin= g style when
> +# the name regexes allow several styles.
> +name-group=3D
> +
> +# Regular expression which should only match function or class names = that do
> +# not require a docstring.
> +no-docstring-rgx=3D^_
> +
> +# List of decorators that produce properties, such as abc.abstractpro= perty. Add
> +# to this list to register other decorators that produce valid proper= ties.
> +# These decorators are taken in consideration only for invalid-name.<= br> > +property-classes=3Dabc.abstractproperty
> +
> +# Regular expression matching correct type alias names. If left empty= , type
> +# alias names will be checked with the set naming style.
> +#typealias-rgx=3D
> +
> +# Regular expression matching correct type variable names. If left em= pty, type
> +# variable names will be checked with the set naming style.
> +#typevar-rgx=3D
> +
> +# Naming style matching correct variable names.
> +variable-naming-style=3Dsnake_case
> +
> +# Regular expression matching correct variable names. Overrides varia= ble-
> +# naming-style. If left empty, variable names will be checked with th= e set
> +# naming style.
> +#variable-rgx=3D
> +
> +
> +[CLASSES]
> +
> +# Warn about protected attribute access inside special methods
> +check-protected-access-in-special-methods=3Dno
> +
> +# List of method names used to declare (i.e. assign) instance attribu= tes.
> +defining-attr-methods=3D__init__,
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 __new__,
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 setUp,
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 __post_init__
> +
> +# List of member names, which should be excluded from the protected a= ccess
> +# warning.
> +exclude-protected=3D_asdict,_fields,_replace,_source,_make,os._exit > +
> +# List of valid names for the first argument in a class method.
> +valid-classmethod-first-arg=3Dcls
> +
> +# List of valid names for the first argument in a metaclass class met= hod.
> +valid-metaclass-classmethod-first-arg=3Dmcs
> +
> +
> +[DESIGN]
> +
> +# List of regular expressions of class ancestor names to ignore when = counting
> +# public methods (see R0903)
> +exclude-too-few-public-methods=3D
> +
> +# List of qualified class names to ignore when counting class parents= (see
> +# R0901)
> +ignored-parents=3D
> +
> +# Maximum number of arguments for function / method.
> +max-args=3D5
> +
> +# Maximum number of attributes for a class (see R0902).
> +max-attributes=3D7
> +
> +# Maximum number of boolean expressions in an if statement (see R0916= ).
> +max-bool-expr=3D5
> +
> +# Maximum number of branch for function / method body.
> +max-branches=3D12
> +
> +# Maximum number of locals for function / method body.
> +max-locals=3D15
> +
> +# Maximum number of parents for a class (see R0901).
> +max-parents=3D7
> +
> +# Maximum number of public methods for a class (see R0904).
> +max-public-methods=3D20
> +
> +# Maximum number of return / yield for function / method body.
> +max-returns=3D6
> +
> +# Maximum number of statements in function / method body.
> +max-statements=3D50
> +
> +# Minimum number of public methods for a class (see R0903).
> +min-public-methods=3D2
> +
> +
> +[EXCEPTIONS]
> +
> +# Exceptions that will emit a warning when caught.
> +overgeneral-exceptions=3Dbuiltins.BaseException,builtins.Exception > +
> +
> +[FORMAT]
> +
> +# Expected format of line ending, e.g. empty (any line ending), LF or= CRLF.
> +expected-line-ending-format=3D
> +
> +# Regexp for a line that is allowed to be longer than the limit.
> +ignore-long-lines=3D^\s*(# )?<?https?://\S+>?$
> +
> +# Number of spaces of indent required inside a hanging or continued l= ine.
> +indent-after-paren=3D4
> +
> +# String used as indentation unit. This is usually "=C2=A0 =C2= =A0 " (4 spaces) or "\t" (1
> +# tab).
> +indent-string=3D'=C2=A0 =C2=A0 '
> +
> +# Maximum number of characters on a single line.
> +max-line-length=3D100
> +
> +# Maximum number of lines in a module.
> +max-module-lines=3D1000
> +
> +# Allow the body of a class to be on the same line as the declaration= if body
> +# contains single statement.
> +single-line-class-stmt=3Dno
> +
> +# Allow the body of an if to be on the same line as the test if there= is no
> +# else.
> +single-line-if-stmt=3Dno
> +
> +
> +[IMPORTS]
> +
> +# List of modules that can be imported at any level, not just the top= level
> +# one.
> +allow-any-import-level=3D
> +
> +# Allow explicit reexports by alias from a package __init__.
> +allow-reexport-from-package=3Dno
> +
> +# Allow wildcard imports from modules that define __all__.
> +allow-wildcard-with-all=3Dno
> +
> +# Deprecated modules which should not be used, separated by a comma.<= br> > +deprecated-modules=3D
> +
> +# Output a graph (.gv or any supported image format) of external depe= ndencies
> +# to the given file (report RP0402 must not be disabled).
> +ext-import-graph=3D
> +
> +# Output a graph (.gv or any supported image format) of all (i.e. int= ernal and
> +# external) dependencies to the given file (report RP0402 must not be=
> +# disabled).
> +import-graph=3D
> +
> +# Output a graph (.gv or any supported image format) of internal depe= ndencies
> +# to the given file (report RP0402 must not be disabled).
> +int-import-graph=3D
> +
> +# Force import order to recognize a module as part of the standard > +# compatibility libraries.
> +known-standard-library=3D
> +
> +# Force import order to recognize a module as part of a third party l= ibrary.
> +known-third-party=3Denchant
> +
> +# Couples of modules and preferred modules, separated by a comma.
> +preferred-modules=3D
> +
> +
> +[LOGGING]
> +
> +# The type of string formatting that logging methods do. `old` means = using %
> +# formatting, `new` is for `{}` formatting.
> +logging-format-style=3Dold
> +
> +# Logging modules to check that the string format arguments are in lo= gging
> +# function parameter format.
> +logging-modules=3Dlogging
> +
> +
> +[MESSAGES CONTROL]
> +
> +# Only show warnings with the listed confidence levels. Leave empty t= o show
> +# all. Valid levels: HIGH, CONTROL_FLOW, INFERENCE, INFERENCE_FAILURE= ,
> +# UNDEFINED.
> +confidence=3DHIGH,
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0CONTROL_FLOW,
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0INFERENCE,
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0INFERENCE_FAILURE,
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0UNDEFINED
> +
> +# Disable the message, report, category or checker with the given id(= s). You
> +# can either give multiple identifiers separated by comma (,) or put = this
> +# option multiple times (only on the command line, not in the configu= ration
> +# file where it should appear only once). You can also use "--di= sable=3Dall" to
> +# disable everything first and then re-enable specific checks. For ex= ample, if
> +# you want to run only the similarities checker, you can use "--= disable=3Dall
> +# --enable=3Dsimilarities". If you want to run only the classes = checker, but have
> +# no Warning level messages displayed, use "--disable=3Dall --en= able=3Dclasses
> +# --disable=3DW".
> +disable=3Draw-checker-failed,
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 bad-inline-option,
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 locally-disabled,
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 file-ignored,
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 suppressed-message,
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 useless-suppression,
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 deprecated-pragma,
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 use-symbolic-message-instead
> +
> +# Enable the message, report, category or checker with the given id(s= ). You can
> +# either give multiple identifier separated by comma (,) or put this = option
> +# multiple time (only on the command line, not in the configuration f= ile where
> +# it should appear only once). See also the "--disable" opt= ion for examples.
> +enable=3Dc-extension-no-member
> +
> +
> +[METHOD_ARGS]
> +
> +# List of qualified names (i.e., library.method) which require a time= out
> +# parameter e.g. 'requests.api.get,requests.api.post'
> +timeout-methods=3Drequests.api.delete,requests.api.get,requests.api.h= ead,requests.api.options,requests.api.patch,requests.api.post,requests.a= pi.put,requests.api.request
> +
> +
> +[MISCELLANEOUS]
> +
> +# List of note tags to take in consideration, separated by a comma. > +notes=3DFIXME,
> +=C2=A0 =C2=A0 =C2=A0 XXX,
> +=C2=A0 =C2=A0 =C2=A0 TODO
> +
> +# Regular expression of note tags to take in consideration.
> +notes-rgx=3D
> +
> +
> +[REFACTORING]
> +
> +# Maximum number of nested blocks for function / method body
> +max-nested-blocks=3D5
> +
> +# Complete name of functions that never returns. When checking for > +# inconsistent-return-statements if a never returning function is cal= led then
> +# it will be considered as an explicit return statement and no messag= e will be
> +# printed.
> +never-returning-functions=3Dsys.exit,argparse.parse_error
> +
> +
> +[REPORTS]
> +
> +# Python expression which should return a score less than or equal to= 10. You
> +# have access to the variables 'fatal', 'error', '= ;warning', 'refactor',
> +# 'convention', and 'info' which contain the number o= f messages in each
> +# category, as well as 'statement' which is the total number = of statements
> +# analyzed. This score is used by the global evaluation report (RP000= 4).
> +evaluation=3Dmax(0, 0 if fatal else 10.0 - ((float(5 * error + warnin= g + refactor + convention) / statement) * 10))
> +
> +# Template used to display messages. This is a python new-style forma= t string
> +# used to format the message information. See doc for all details. > +msg-template=3D
> +
> +# Set the output format. Available formats are text, parseable, color= ized, json
> +# and msvs (visual studio). You can also give a reporter class, e.g.<= br> > +# mypackage.mymodule.MyReporterClass.
> +#output-format=3D
> +
> +# Tells whether to display a full report or only the messages.
> +reports=3Dno
> +
> +# Activate the evaluation score.
> +score=3Dyes
> +
> +
> +[SIMILARITIES]
> +
> +# Comments are removed from the similarity computation
> +ignore-comments=3Dyes
> +
> +# Docstrings are removed from the similarity computation
> +ignore-docstrings=3Dyes
> +
> +# Imports are removed from the similarity computation
> +ignore-imports=3Dyes
> +
> +# Signatures are removed from the similarity computation
> +ignore-signatures=3Dyes
> +
> +# Minimum lines number of a similarity.
> +min-similarity-lines=3D4
> +
> +
> +[SPELLING]
> +
> +# Limits count of emitted suggestions for spelling mistakes.
> +max-spelling-suggestions=3D4
> +
> +# Spelling dictionary name. No available dictionaries : You need to i= nstall
> +# both the python package and the system dependency for enchant to wo= rk..
> +spelling-dict=3D
> +
> +# List of comma separated words that should be considered directives = if they
> +# appear at the beginning of a comment and should not be checked.
> +spelling-ignore-comment-directives=3Dfmt: on,fmt: off,noqa:,noqa,nose= c,isort:skip,mypy:
> +
> +# List of comma separated words that should not be checked.
> +spelling-ignore-words=3D
> +
> +# A path to a file that contains the private dictionary; one word per= line.
> +spelling-private-dict-file=3D
> +
> +# Tells whether to store unknown words to the private dictionary (see= the
> +# --spelling-private-dict-file option) instead of raising a message.<= br> > +spelling-store-unknown-words=3Dno
> +
> +
> +[STRING]
> +
> +# This flag controls whether inconsistent-quotes generates a warning = when the
> +# character used as a quote delimiter is used inconsistently within a= module.
> +check-quote-consistency=3Dno
> +
> +# This flag controls whether the implicit-str-concat should generate = a warning
> +# on implicit string concatenation in sequences defined over several = lines.
> +check-str-concat-over-line-jumps=3Dno
> +
> +
> +[TYPECHECK]
> +
> +# List of decorators that produce context managers, such as
> +# contextlib.contextmanager. Add to this list to register other decor= ators that
> +# produce valid context managers.
> +contextmanager-decorators=3Dcontextlib.contextmanager
> +
> +# List of members which are set dynamically and missed by pylint infe= rence
> +# system, and so shouldn't trigger E1101 when accessed. Python re= gular
> +# expressions are accepted.
> +generated-members=3D
> +
> +# Tells whether to warn about missing members when the owner of the a= ttribute
> +# is inferred to be None.
> +ignore-none=3Dyes
> +
> +# This flag controls whether pylint should warn about no-member and s= imilar
> +# checks whenever an opaque object is returned when inferring. The in= ference
> +# can return multiple potential results while evaluating a Python obj= ect, but
> +# some branches might not be evaluated, which results in partial infe= rence. In
> +# that case, it might be useful to still emit no-member and other che= cks for
> +# the rest of the inferred objects.
> +ignore-on-opaque-inference=3Dyes
> +
> +# List of symbolic message names to ignore for Mixin members.
> +ignored-checks-for-mixins=3Dno-member,
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 not-async-context-manager,
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 not-context-manager,
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 attribute-defined-outside-init
> +
> +# List of class names for which member attributes should not be check= ed (useful
> +# for classes with dynamically set attributes). This supports the use= of
> +# qualified names.
> +ignored-classes=3Doptparse.Values,thread._local,_thread._local,argpar= se.Namespace
> +
> +# Show a hint with possible names when a member name was not found. T= he aspect
> +# of finding the hint is based on edit distance.
> +missing-member-hint=3Dyes
> +
> +# The minimum edit distance a name should have in order to be conside= red a
> +# similar match for a missing member name.
> +missing-member-hint-distance=3D1
> +
> +# The total number of similar names that should be taken in considera= tion when
> +# showing a hint for a missing member.
> +missing-member-max-choices=3D1
> +
> +# Regex pattern to define which classes are considered mixins.
> +mixin-class-rgx=3D.*[Mm]ixin
> +
> +# List of decorators that change the signature of a decorated functio= n.
> +signature-mutators=3D
> +
> +
> +[VARIABLES]
> +
> +# List of additional names supposed to be defined in builtins. Rememb= er that
> +# you should avoid defining new builtins when possible.
> +additional-builtins=3D
> +
> +# Tells whether unused global variables should be treated as a violat= ion.
> +allow-global-unused-variables=3Dyes
> +
> +# List of names allowed to shadow builtins
> +allowed-redefined-builtins=3D
> +
> +# List of strings which can identify a callback function by name. A c= allback
> +# name must start or end with one of those strings.
> +callbacks=3Dcb_,
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 _cb
> +
> +# A regular expression matching the name of dummy variables (i.e. exp= ected to
> +# not be used).
> +dummy-variables-rgx=3D_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignor= ed_|^unused_
> +
> +# Argument names that match this expression will be ignored.
> +ignored-argument-names=3D_.*|^ignored_|^unused_
> +
> +# Tells whether we should check for unused import in __init__ files.<= br> > +init-import=3Dno
> +
> +# List of qualified module names which can have objects that can rede= fine
> +# builtins.
> +redefining-builtins-modules=3Dsix.moves,past.builtins,future.builtins= ,builtins,io
> diff --git a/check_whence.py b/check_whence.py
> index 711be36..4dfda90 100755
> --- a/check_whence.py
> +++ b/check_whence.py
> @@ -1,73 +1,102 @@
> -#!/usr/bin/python3
> +#!/usr/bin/env python3
> +""" check_whence """
>
> -import os, re, sys
> +import os
> +import re
> +import sys
>=C2=A0 from io import open
>
> +
>=C2=A0 def list_whence():
> -=C2=A0 =C2=A0 with open('WHENCE', encoding=3D'utf-8')= as whence:
> +=C2=A0 =C2=A0 """
> +=C2=A0 =C2=A0 list_whence
> +=C2=A0 =C2=A0 """
> +=C2=A0 =C2=A0 with open("WHENCE", encoding=3D"utf-8&qu= ot;) as whence:
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 for line in whence:
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 match =3D re.match(r&#= 39;(?:File|Source):\s*"(.*)"', line)
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if match:
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 yield ma= tch.group(1)
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 continue=
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 match =3D re.match(r'(?= :File|Source):\s*(\S*)', line)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 match =3D re.match(r"(= ?:File|Source):\s*(\S*)", line)
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if match:
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 yield ma= tch.group(1)
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 continue=
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 match =3D re.match(r'Li= cen[cs]e: (?:.*\bSee (.*) for details\.?|(\S*))\n',
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0line)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 match =3D re.match(
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 r"Licen[= cs]e: (?:.*\bSee (.*) for details\.?|(\S*))\n", line
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 )
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if match:
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if match= .group(1):
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= for name in re.split(r', | and ', match.group(1)):
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= for name in re.split(r", | and ", match.group(1)):
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 yield name
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 continue
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if match= .group(2):
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 # Just one word - may or may not be a filename
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= if not re.search(r'unknown|distributable', match.group(2),
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0re.IGNORECAS= E):
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= if not re.search(
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 r"unknown|distributable", match.group(2), re.IGNOR= ECASE
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= ):
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 yield match.group(2)
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 continue
>
> +
>=C2=A0 def list_whence_files():
> -=C2=A0 =C2=A0 with open('WHENCE', encoding=3D'utf-8')= as whence:
> +=C2=A0 =C2=A0 """
> +=C2=A0 =C2=A0 list_whence_files
> +=C2=A0 =C2=A0 """
> +=C2=A0 =C2=A0 with open("WHENCE", encoding=3D"utf-8&qu= ot;) as whence:
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 for line in whence:
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 match =3D re.match(r'Fi= le:\s*(.*)', line)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 match =3D re.match(r"F= ile:\s*(.*)", line)
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if match:
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 yield match.g= roup(1).replace("\ ", " ")
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 yield match.g= roup(1).replace(r"\ ", " ")
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 continue=
>
> +
>=C2=A0 def list_git():
> -=C2=A0 =C2=A0 with os.popen('git ls-files') as git_files:
> +=C2=A0 =C2=A0 """
> +=C2=A0 =C2=A0 list_git
> +=C2=A0 =C2=A0 """
> +=C2=A0 =C2=A0 with os.popen("git ls-files") as git_files: >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 for line in git_files:
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 yield line.rstrip('\n&#= 39;)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 yield line.rstrip("\n&= quot;)
> +
>
>=C2=A0 def main():
> +=C2=A0 =C2=A0 """
> +=C2=A0 =C2=A0 main
> +=C2=A0 =C2=A0 """
>=C2=A0 =C2=A0 =C2=A0 ret =3D 0
>=C2=A0 =C2=A0 =C2=A0 whence_list =3D list(list_whence())
>=C2=A0 =C2=A0 =C2=A0 whence_files =3D list(list_whence_files())
> -=C2=A0 =C2=A0 known_files =3D set(name for name in whence_list if not= name.endswith('/')) | \
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 set([&= #39;check_whence.py', 'configure', 'Makefile',
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0'README', 'copy-firmware.sh', 'WHENCE'= ;])
> -=C2=A0 =C2=A0 known_prefixes =3D set(name for name in whence_list if = name.endswith('/'))
> +=C2=A0 =C2=A0 # pylint: disable-next=3Dline-too-long
> +=C2=A0 =C2=A0 known_files =3D set(name for name in whence_list if not= name.endswith("/")) | set(
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 [
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 "check_whence.py"= ,
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 "configure",
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 "Makefile",
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 "README",
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 "copy-firmware.sh"= ;,
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 "WHENCE",
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 ]
> +=C2=A0 =C2=A0 )
> +=C2=A0 =C2=A0 known_prefixes =3D set(name for name in whence_list if = name.endswith("/"))
>=C2=A0 =C2=A0 =C2=A0 git_files =3D set(list_git())
>
> -=C2=A0 =C2=A0 for name in set(name for name in whence_files if name.e= ndswith('/')):
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 sys.stderr.write('E: %s listed in WHE= NCE as File, but is directory\n' %
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0name)
> +=C2=A0 =C2=A0 for name in set(name for name in whence_files if name.e= ndswith("/")):
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 sys.stderr.write(f"E: {name} listed = in WHENCE as File, but is directory\n")
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ret =3D 1
>
>=C2=A0 =C2=A0 =C2=A0 for name in set(fw for fw in whence_files if whenc= e_files.count(fw) > 1):
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 sys.stderr.write('E: %s listed in WHE= NCE twice\n' % name)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 sys.stderr.write(f"E: {name} listed = in WHENCE twice\n")
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ret =3D 1
>
>=C2=A0 =C2=A0 =C2=A0 for name in sorted(list(known_files - git_files)):=
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 sys.stderr.write('E: %s listed in WHE= NCE does not exist\n' % name)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 sys.stderr.write(f"E: {name} listed = in WHENCE does not exist\n" % name)
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ret =3D 1
>
>=C2=A0 =C2=A0 =C2=A0 for name in sorted(list(git_files - known_files)):=
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 # Ignore subdirectory changelogs and= GPG detached signatures
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 if (name.endswith('/ChangeLog') o= r
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (name.endswith('.asc= 9;) and name[:-4] in known_files)):
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 if name.endswith("/ChangeLog") = or (
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 name.endswith(".asc&qu= ot;) and name[:-4] in known_files
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 ):
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 continue
>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 # Ignore unknown files in known dire= ctories
> @@ -75,9 +104,10 @@ def main():
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if name.startswith(pre= fix):
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 break >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 else:
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 sys.stderr.write('E: %s= not listed in WHENCE\n' % name)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 sys.stderr.write(f"E: = {name} not listed in WHENCE\n")
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ret =3D 1
>=C2=A0 =C2=A0 =C2=A0 return ret
>
> -if __name__ =3D=3D '__main__':
> +
> +if __name__ =3D=3D "__main__":
>=C2=A0 =C2=A0 =C2=A0 sys.exit(main())
> --
> 2.40.1
>
--000000000000a6f7df05fbc1eabc--