Michael,

One comment below.

Mike

> -----Original Message-----
> From: mikub...@linux.microsoft.com <mikub...@linux.microsoft.com>
> Sent: Monday, March 21, 2022 6:58 PM
> To: devel@edk2.groups.io
> Cc: Kinney, Michael D <michael.d.kin...@intel.com>; Gao, Liming 
> <gaolim...@byosoft.com.cn>; Sean Brogan
> <sean.bro...@microsoft.com>; Bret Barkelew <bret.barke...@microsoft.com>
> Subject: [PATCH v1 2/4] .pytool/Plugin/UncrustifyCheck: Add ignore file 
> support
> 
> From: Michael Kubacki <michael.kuba...@microsoft.com>
> 
> REF:https://bugzilla.tianocore.org/show_bug.cgi?id=3880
> 
> Currently UncrustifyCheck.py provides the following exclusion
> options:
> 
> 1. Override the type of files UncrustifyCheck operates against by
> default (.c and .h files). Using the "IgnoreStandardPaths"
> configuration option.
> 
> 2. By default, UncrustifyCheck skips files in git submodules and
> ignored by git (the "SkipGitExclusions" configuration option can
> override this behavior).
> 
> The goal of UncrustifyCheck is to provide consistent formatting
> across the codebase. In some rare circumstances, maintainers might
> need to exclude a specific file (or file pattern) within their
> package. For example, a small set of auto-generated files from
> another repository.
> 
> This change adds a new configuration option that can be specified
> in a package CI YAML file to describe a list of files within the
> package that should be ignored by UncrustifyCheck.
> 
> The configuration option is called "IgnoreFiles" and it uses similar
> syntax to git ignore to ignore a list of files.
> 
> Cc: Michael D Kinney <michael.d.kin...@intel.com>
> Cc: Liming Gao <gaolim...@byosoft.com.cn>
> Cc: Sean Brogan <sean.bro...@microsoft.com>
> Cc: Bret Barkelew <bret.barke...@microsoft.com>
> Signed-off-by: Michael Kubacki <michael.kuba...@microsoft.com>
> ---
>  .pytool/Plugin/UncrustifyCheck/Readme.md          |  7 ++++++
>  .pytool/Plugin/UncrustifyCheck/UncrustifyCheck.py | 24 ++++++++++++++++++++
>  2 files changed, 31 insertions(+)
> 
> diff --git a/.pytool/Plugin/UncrustifyCheck/Readme.md 
> b/.pytool/Plugin/UncrustifyCheck/Readme.md
> index 0c46fd241a7a..efe7a573e4fa 100644
> --- a/.pytool/Plugin/UncrustifyCheck/Readme.md
> +++ b/.pytool/Plugin/UncrustifyCheck/Readme.md
> @@ -41,6 +41,7 @@ The plugin can be configured with a few optional 
> configuration options.
>        "AdditionalIncludePaths": [], # Additional paths to check formatting 
> (wildcards supported).
>        "AuditOnly": False,           # Don't fail the build if there are 
> errors.  Just log them.
>        "ConfigFilePath": "",         # Custom path to an Uncrustify config 
> file.
> +      "IgnoreFiles": [],            # A list of file patterns to ignore.
>        "IgnoreStandardPaths": [],    # Standard Plugin defined paths that 
> should be ignored.
>        "OutputFileDiffs": True,      # Output chunks of formatting diffs in 
> the test case log.
>                                      # This can significantly slow down the 
> plugin on very large packages.
> @@ -67,6 +68,12 @@ the test as skipped. This allows visibility into the 
> failures without breaking t
> 
>  When specified in the config file, this is a package relative path to the 
> Uncrustify configuration file.
> 
> +### `IgnoreFiles`
> +
> +This option supports .gitignore file and folder matching strings including 
> wildcards.
> +
> +The files specified by this configuration option will not be processed by 
> Uncrustify.
> +
>  ### `IgnoreStandardPaths`
> 
>  This plugin by default will check the below standard paths. A package 
> configuration file can specify any of these paths
> diff --git a/.pytool/Plugin/UncrustifyCheck/UncrustifyCheck.py 
> b/.pytool/Plugin/UncrustifyCheck/UncrustifyCheck.py
> index dc133fecc4b2..e8370381032f 100644
> --- a/.pytool/Plugin/UncrustifyCheck/UncrustifyCheck.py
> +++ b/.pytool/Plugin/UncrustifyCheck/UncrustifyCheck.py
> @@ -13,11 +13,13 @@ import os
>  import pathlib
>  import shutil
>  import timeit
> +from collections.abc import Callable
>  from edk2toolext.environment import version_aggregator
>  from edk2toolext.environment.plugin_manager import PluginManager
>  from edk2toolext.environment.plugintypes.ci_build_plugin import 
> ICiBuildPlugin
>  from edk2toolext.environment.plugintypes.uefi_helper_plugin import 
> HelperFunctions
>  from edk2toolext.environment.var_dict import VarDict
> +from edk2toollib.gitignore_parser import parse_gitignore_lines
>  from edk2toollib.log.junit_report_format import JunitReportTestCase
>  from edk2toollib.uefi.edk2.path_utilities import Edk2Path
>  from edk2toollib.utility_functions import  RunCmd
> @@ -273,6 +275,15 @@ class UncrustifyCheck(ICiBuildPlugin):
>              f"-c {self._app_config_file} -F {self._app_input_file_path} 
> --if-changed --suffix
> {UncrustifyCheck.FORMATTED_FILE_EXTENSION}", outstream=output)
>          self._app_output = output.getvalue().strip().splitlines()
> 
> +    def _get_files_ignored_in_config(self) -> Callable[[str], bool]:
> +        """"
> +        Returns a function that returns true if a given file string path is 
> ignored in the plugin configuration file and false
> otherwise.
> +        """
> +        ignored_files = []
> +        if "IgnoreFiles" in self._package_config:
> +            ignored_files = self._package_config["IgnoreFiles"]
> +        return parse_gitignore_lines(ignored_files, 
> os.path.join(self._abs_workspace_path, "nofile.txt"),
> self._abs_workspace_path)

What is the purpose of "nofile.txt" here?  If this a param that is 
optional/ignored?  If so, there
are better python methods to do that.

> +
>      def _get_git_ignored_paths(self) -> List[str]:
>          """"
>          Returns a list of file absolute path strings to all files ignored in 
> this git repository.
> @@ -464,6 +475,19 @@ class UncrustifyCheck(ICiBuildPlugin):
>              self._abs_file_paths_to_format.extend(
>                  [str(path.resolve()) for path in 
> pathlib.Path(self._abs_package_path).rglob(path)])
> 
> +        # Remove files ignore in the plugin configuration file
> +        plugin_ignored_files = 
> list(filter(self._get_files_ignored_in_config(), 
> self._abs_file_paths_to_format))
> +
> +        if plugin_ignored_files:
> +            logging.info(
> +                f"{self._package_name} file count before plugin ignore file 
> exclusion: {len(self._abs_file_paths_to_format)}")
> +            for path in plugin_ignored_files:
> +                if path in self._abs_file_paths_to_format:
> +                    logging.info(f"  File ignored in plugin config file: 
> {path}")
> +                    self._abs_file_paths_to_format.remove(path)
> +            logging.info(
> +                f"{self._package_name} file count after plugin ignore file 
> exclusion: {len(self._abs_file_paths_to_format)}")
> +
>          if not "SkipGitExclusions" in self._package_config or not 
> self._package_config["SkipGitExclusions"]:
>              # Remove files ignored by git
>              logging.info(
> --
> 2.28.0.windows.1



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#87840): https://edk2.groups.io/g/devel/message/87840
Mute This Topic: https://groups.io/mt/89944184/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-


Reply via email to