Reviewed-by: Maciej Rabeda <maciej.rab...@linux.intel.com>

On 06-Dec-21 02:17, Michael D Kinney wrote:
Hello EDK II Maintainers,

A detailed evaluation of the DEBUG_CODE() formatting issue has been completed.
The reason DEBUG_CODE() is a challenge is that this looks like a macro from a
C parsing perspective, but the EDK II usage places C statements or blocks of
C code as the parameter to this macro.

There are actually 2 methods available to mark a statement or a block of code
to be included when the DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit is enabled in
PcdDebugPropertyMask. One is DEBUG_CODE() and the other is to mark the beginning
and end of a code block with DEBUG_CODE_BEGIN() and DEBUG_CODE_END().  In fact,
DEBUG_CODE() is implemented using DEBUG_CODE_BEGIN() and DEBUG_CODE_END() 
macros.

     #define DEBUG_CODE(Expression)  \
       DEBUG_CODE_BEGIN ();          \
       Expression                    \
       DEBUG_CODE_END ()

A complete review for the use of these DEBUG_CODE macros was performed on the
edk2 repo.  Uncrustify performs good formatting for code blocks between
DEBUG_CODE_BEGIN() and DEBUG_CODE_END().  This is because these look like simple
macros calls with no parameters and the lines of C code between these 2 macros
is formatted correctly.

The uncrustify formatting issues are only present with the use of DEBUG_CODE().
Simple use cases of DEBUG_CODE(Expression) where Expression is a single C
statement also look correct.  A medium complexity use case where Expression is
a code block of simple statements or even some local variables and simple
statements  also look correct.  It is only complex code blocks that use C
statements such as if/for/while/case that include the use of braces {} does
uncrustify perform incorrect formatting.

The recommended solution to this issue is to convert the use of DEBUG_CODE()
to DEBUG_CODE_BEGIN() / DEBUG_CODE_END() for cases where the Expression
passed to DEBUG_CODE() is the complex use case that contains statements that
use braces {}.  There are 57 instances of this pattern across 40 files in the
edk2 repo.

I have posted a branch with these additional patches:

     
https://github.com/mdkinney/edk2/tree/Bug_3737_3760_3739_ApplyUncrustifyChanges_V7

I have performed CompareBuild tests with this revised patch series with
the DEBUG_CODE changes.  It passes 100% showing no binary differences.

     https://github.com/mdkinney/edk2/actions/runs/1542454606

I have opened a PR to run this patch series through EDK II CI. It also passes 
100%.

     https://github.com/tianocore/edk2/pull/2236

The summary of changes made since the V6 review are:

     1) Change uncrustify configuration assignment alignment threshold to 0

         align_assign_thresh = 0

     2) Replace "<param>, OPTIONAL" with "<param> OPTIONAL,"

     3) Replace DEBUG_CODE(Expression) with

            DEBUG_CODE_BEGIN();
            Expression
            DEBUG_CODE_END()

        if Expression is complex and contains braces {}.

     4) No changes to uncrustify tool required.

Please review the differences between the following 2 branches and provide
feedback or a Series Reviewed-by if you agree with these additional changes.

     
https://github.com/mdkinney/edk2/tree/Bug_3737_3760_3739_ApplyUncrustifyChanges_V6
     
https://github.com/mdkinney/edk2/tree/Bug_3737_3760_3739_ApplyUncrustifyChanges_V7

The goal is to complete the review and get the uncrustify change committed
tomorrow so the extended hard freeze can be lifted.

Thanks,

Mike

-----Original Message-----
From: Kinney, Michael D <michael.d.kin...@intel.com>
Sent: Thursday, December 2, 2021 6:23 PM
To: Michael Kubacki <mikub...@linux.microsoft.com>; devel@edk2.groups.io; 
maciej.rab...@linux.intel.com; Michael Kubacki
<michael.kuba...@microsoft.com>; Andrew Fish (af...@apple.com) <af...@apple.com>; 
Leif Lindholm <l...@nuviainc.com>;
Kinney, Michael D <michael.d.kin...@intel.com>
Subject: RE: [edk2-devel] Uncrustify Conversion Detailed Plan and Extended Hard 
Freeze Update #4

Hello EDK II Maintainers,

I have entered BZ 3760 to make the use of the OPTIONAL keyword style consistent 
for all of edk2 repo
and to be compatible with uncrustify.

I have posted the following V6 branch that does the EFI_D_* to DEBUG_* changes, 
the OPTIONAL keyword
style changes, and the uncrustify changes with the one configuration change for 
assignment alignment.

     
https://github.com/mdkinney/edk2/tree/Bug_3737_3760_3739_ApplyUncrustifyChanges_V6

Please provide feedback on the code style in this branch with the known 
DEBUG_CODE() issue still
present.

If we are able to quickly update uncrustify to handle DEBUG_CODE(), I will 
generate a V7.

Thanks,

Mike

-----Original Message-----
From: Kinney, Michael D <michael.d.kin...@intel.com>
Sent: Thursday, December 2, 2021 4:53 PM
To: Michael Kubacki <mikub...@linux.microsoft.com>; devel@edk2.groups.io; 
maciej.rab...@linux.intel.com; Michael Kubacki
<michael.kuba...@microsoft.com>; Andrew Fish (af...@apple.com) <af...@apple.com>; 
Leif Lindholm <l...@nuviainc.com>;
Kinney, Michael D <michael.d.kin...@intel.com>
Subject: RE: [edk2-devel] Uncrustify Conversion Detailed Plan and Extended Hard 
Freeze Update #4

Michael,

Yes.  Please update the patch series that adds UncrustifyCheck with those 
changes.

Thanks,

Mike

-----Original Message-----
From: Michael Kubacki <mikub...@linux.microsoft.com>
Sent: Thursday, December 2, 2021 4:31 PM
To: Kinney, Michael D <michael.d.kin...@intel.com>; devel@edk2.groups.io; 
maciej.rab...@linux.intel.com; Michael
Kubacki
<michael.kuba...@microsoft.com>; Andrew Fish (af...@apple.com) <af...@apple.com>; 
Leif Lindholm <l...@nuviainc.com>
Subject: Re: [edk2-devel] Uncrustify Conversion Detailed Plan and Extended Hard 
Freeze Update #4

Hi Mike,

Thank you for the detailed analysis and recommendations.

I agree with the recommendations and I will try to have an Uncrustify
tool update by tomorrow for (4).

That will require an update in uncrustify_ext_dep.yaml to pull in the
new version. I'm assuming I should also update uncrustify.cfg to set
align_assign_thresh = 0 in that new patch series?

Regards,
Michael

On 12/2/2021 7:18 PM, Kinney, Michael D wrote:
Hi Michael,

CORRECTION: set align_assign_threshold to 0.

Reponses inline below.

I would like to summarize the 4 issues raised in the past day along with the 
recommendations.

1) Exclusion feature for UncrustifyCheck.  There are 2 directories with 8 files 
total that
     maintainers have noted they would like to see not go through uncrustify 
formatting.  Today
     the only content that is skipped is BaseTools and submodules.

     Adding a general purpose exclusion feature would then require all 
developers to make
     sure their method of using uncrustify also excludes those same areas.  
This requires
     extra steps for all developers and maintainers.

     If we do not add the exclusion feature, then the 8 files will require an 
extra step
     to sync with the original source of those files.  The rate of changes of 
these 8 files
     is very low today.

     RECOMMENDATION: Do not add exclusion feature at this time.  Revisit if the 
extra work
     to maintain the files that would be candidates for exclusions increases 
significantly.

2) Alignment of assignments.  The threshold of 4 characters appears to be too 
low and causes
     source files that are already aligned to become unaligned.

     RECOMMENDATION: Change threshold to the default value of 0 which means no 
limit.

         align_assign_thresh= 0

3) Alignment of parameters in function declaration not correct.  The root cause 
of this
     is the use of the OPTIONAL keyword.  If the OPTIONAL keyword is removed, 
then the
     alignment is correct.  The alignment is also correct if the OPTIONAL 
keyword appears
     before the ','.  If the OPTIONAL keyword appears after the ',', then the 
format is
     not correct.  The OPTIONAL keyword indicates that the parameter in the 
function is
     not required and may be passed in as NULL or 0 or some other default value 
defined by
     the API.  It makes more sense for this OPTIONAL keyword that follows the 
parameter
     names to appear before the ',' so it is scoped to the parameter on that 
line.  If it
     appears after the ',', then C parsers thinks it is a prefix (IN, OUT, 
CONST, volatile,
     static) for the next parameter in the function.

     RECOMMENDATION: Update patch series with a global search and replace so 
OPTIONAL
     keyword always appears before the ',' on the same line.

        RegEx search string:  ',( *)OPTIONAL( *)'
        RegEx replace string: ' $1OPTIONAL,$2'

4) Format issues with complex blocks in DEBUG_CODE(), or between 
DEBUG_CODE_BEGIN() and
     DEBUG_CODE_END().  Uncrustify treats these as macros and is not aware that 
the
     parameter passed into the macro call is a block of C code that needs to be 
formatted.
     Complex blocks with if/while/for/case statements are impacted the most.

     RECOMMENDATION: Update the uncrustify with an edk2 specific extension to 
treat these
     macros as a block of code as if they were surrounded by an extra set of 
braces {}.


I have posted a branch for testing purposes that implements (2) and (3).

Branch: 
https://github.com/mdkinney/edk2/tree/TestOnly_Bug_3737_3739_ApplyUncrustifyChanges_V6_OPTIONAL_Keyword_Fix
PR: https://github.com/tianocore/edk2/pull/2233
    Status: PASS
CompareBuild: https://github.com/mdkinney/edk2/actions/runs/1532855914
    Status: PASS

You can see what changed by fetching and comparing the following 2 branches:

      
https://github.com/mdkinney/edk2/tree/Bug_3737_3739_ApplyUncrustifyChanges_V5
      
https://github.com/mdkinney/edk2/tree/TestOnly_Bug_3737_3739_ApplyUncrustifyChanges_V6_OPTIONAL_Keyword_Fix

Please provide feedback on the RECOMMENDATIONS above.  I will go ahead and 
prepare of V6 version of
the patch series now that that test results are all PASS.

Best regards,

Mike


-----Original Message-----
From: Kinney, Michael D <michael.d.kin...@intel.com>
Sent: Thursday, December 2, 2021 4:15 PM
To: Michael Kubacki <mikub...@linux.microsoft.com>; devel@edk2.groups.io; 
maciej.rab...@linux.intel.com; Michael
Kubacki
<michael.kuba...@microsoft.com>; Andrew Fish (af...@apple.com) 
<af...@apple.com>; Leif Lindholm
<l...@nuviainc.com>;
Kinney, Michael D <michael.d.kin...@intel.com>
Subject: RE: [edk2-devel] Uncrustify Conversion Detailed Plan and Extended Hard 
Freeze Update #4

Hi Michael,

Reponses inline below.

I would like to summarize the 4 issues raised in the past day along with the 
recommendations.

1) Exclusion feature for UncrustifyCheck.  There are 2 directories with 8 files 
total that
     maintainers have noted they would like to see not go through uncrustify 
formatting.  Today
     the only content that is skipped is BaseTools and submodules.

     Adding a general purpose exclusion feature would then require all 
developers to make
     sure their method of using uncrustify also excludes those same areas.  
This requires
     extra steps for all developers and maintainers.

     If we do not add the exclusion feature, then the 8 files will require an 
extra step
     to sync with the original source of those files.  The rate of changes of 
these 8 files
     is very low today.

     RECOMMENDATION: Do not add exclusion feature at this time.  Revisit if the 
extra work
     to maintain the files that would be candidates for exclusions increases 
significantly.

2) Alignment of assignments.  The threshold of 4 characters appears to be too 
low and causes
     source files that are already aligned to become unaligned.

     RECOMMENDATION: Change threshold to the default value of 0 which means no 
limit.

         align_assign_thresh= 4

3) Alignment of parameters in function declaration not correct.  The root cause 
of this
     is the use of the OPTIONAL keyword.  If the OPTIONAL keyword is removed, 
then the
     alignment is correct.  The alignment is also correct if the OPTIONAL 
keyword appears
     before the ','.  If the OPTIONAL keyword appears after the ',', then the 
format is
     not correct.  The OPTIONAL keyword indicates that the parameter in the 
function is
     not required and may be passed in as NULL or 0 or some other default value 
defined by
     the API.  It makes more sense for this OPTIONAL keyword that follows the 
parameter
     names to appear before the ',' so it is scoped to the parameter on that 
line.  If it
     appears after the ',', then C parsers thinks it is a prefix (IN, OUT, 
CONST, volatile,
     static) for the next parameter in the function.

     RECOMMENDATION: Update patch series with a global search and replace so 
OPTIONAL
     keyword always appears before the ',' on the same line.

        RegEx search string:  ',( *)OPTIONAL( *)'
        RegEx replace string: ' $1OPTIONAL,$2'

4) Format issues with complex blocks in DEBUG_CODE(), or between 
DEBUG_CODE_BEGIN() and
     DEBUG_CODE_END().  Uncrustify treats these as macros and is not aware that 
the
     parameter passed into the macro call is a block of C code that needs to be 
formatted.
     Complex blocks with if/while/for/case statements are impacted the most.

     RECOMMENDATION: Update the uncrustify with an edk2 specific extension to 
treat these
     macros as a block of code as if they were surrounded by an extra set of 
braces {}.


I have posted a branch for testing purposes that implements (2) and (3).

Branch: 
https://github.com/mdkinney/edk2/tree/TestOnly_Bug_3737_3739_ApplyUncrustifyChanges_V6_OPTIONAL_Keyword_Fix
PR: https://github.com/tianocore/edk2/pull/2233
    Status: PASS
CompareBuild: https://github.com/mdkinney/edk2/actions/runs/1532855914
    Status: PASS

You can see what changed by fetching and comparing the following 2 branches:

      
https://github.com/mdkinney/edk2/tree/Bug_3737_3739_ApplyUncrustifyChanges_V5
      
https://github.com/mdkinney/edk2/tree/TestOnly_Bug_3737_3739_ApplyUncrustifyChanges_V6_OPTIONAL_Keyword_Fix

Please provide feedback on the RECOMMENDATIONS above.  I will go ahead and 
prepare of V6 version of
the patch series now that that test results are all PASS.

Best regards,

Mike


-----Original Message-----
From: Michael Kubacki <mikub...@linux.microsoft.com>
Sent: Thursday, December 2, 2021 1:57 PM
To: devel@edk2.groups.io; Kinney, Michael D <michael.d.kin...@intel.com>; 
maciej.rab...@linux.intel.com; Michael
Kubacki
<michael.kuba...@microsoft.com>; Andrew Fish (af...@apple.com) 
<af...@apple.com>; Leif Lindholm
<l...@nuviainc.com>
Subject: Re: [edk2-devel] Uncrustify Conversion Detailed Plan and Extended Hard 
Freeze Update #4

My reply is inline.

Regards,
Michael

On 12/2/2021 2:45 PM, Michael D Kinney wrote:
Hi Maciej,

Thanks for the feedback.

    * Example #1.This appears to be caused by the following uncrustify
      settings:

# The threshold for aligning on '=' in assignments.

# Use a negative number for absolute thresholds.

#

# 0: No limit (default).

align_assign_thresh= 0# number

The edk2 setting for this is:

align_assign_thresh= 4

This means blocks of assignments that are different than more than 4
spaces will be considered a new block.

‘HwAddreLen’ and ‘Xid’ are more than 4 characters in length
different.Same for ‘Xid’ and ‘Reserved’.So

uncrustify treats these as 3 different assignment blocks.

If we change to the default value of 0: No limit, this example is
treated as a single block and all ‘=’ are aligned.

Is there a reason ‘4’ was selected?Is there is any harm in using the
default of 0?

We can certainly change the threshold. '4' was derived by
experimentation. This is an area that is somewhat subjective and every
case is difficult to cover well. Please feel free to suggest any changes.

I recommend we use the default value of 0.  That way, any code that choose to
align assignments will still be aligned.  If a developer does not like
short assignments and long assignments in the same code block to use the
long assignment column, they can always break the block up into multiple
blocks by adding a carriage return.

For the benefit of others, this file can be a useful refernce
understanding spans, gaps, and thresholds.

https://github.com/uncrustify/uncrustify/blob/master/documentation/htdocs/configuration.txt

    * Example #2: Uncruistfy is confused by the DEBUG_CODE() macro.This is
      not a traditional macro because the

contents of the macro is a block of C code.I do not know how to convince
uncrustify that the contents of a

macro like function call to be treated as a code block from an indent
perspective.

I believe this would have to be overridden in the Uncrustify fork since
DEBUG_CODE() is being treated as a macro function call and code blocks
are not expected there. In addition, some special treatment might be
needed for alignment in between DEBUG_CODE_BEGIN()/DEBUG_CODE_END().

I'm happy to look at this. However, regression validation can take a
while so I'd like to make sure we need this now. In cases that do not
have additional code blocks, it seems to format fairly well. Is this
prevalent and impactful enough it must be fixed now? Or, could we
revisit it with a follow up patch?
How long does regression testing take?  I see about 20 instances of
DEBUG_CODE() that are producing bad formatting.  If the content inside
DEBUG_CODE() is a single line of a single block of statements without
any if/while/for/case statements that require further indent, then the
format looks ok.

DEBUG_CODE_BEGIN() and DEBUG_CODE_END() would look better if the
contents between are also indented one level.

    * Example #3/#4: Uncrustify is confused by the OPTIONAL keyword.The
      edk2 config declares it as a QUALIFIER

like IN and OUT.However, OPTIONAL only appears at the end of the line
that declares a parameter to a

function.There are 3 forms. One with comma after OPTIONAL.One with comma
before OPTIONAL, and

one with no comma if the parameter is the last parameter in the function
declaration.

TYPE ParamName OPTIONAL,

TYPEParamName, OPTIONAL

TYPEParamName OPTIONAL

OPTIONAL is defined to nothing in edk2 builds.From a uncrustify
perspective, we really want is to be

ignored or more correctly treated it as a token that is attached to
ParamName and the combination of

ParamName and OPTIONAL treated as one unit to determine indents.

"TYPE ParamName, OPTIONAL" seems especially problematic and presents an
inconsistency with the other formats. Mike, can you please let me know
if you have the same observation and your thoughts on a consistent pattern?

Thanks,

Mike

*From:*devel@edk2.groups.io <devel@edk2.groups.io> *On Behalf Of *Maciej
Rabeda
*Sent:* Thursday, December 2, 2021 10:27 AM
*To:* devel@edk2.groups.io; Kinney, Michael D
<michael.d.kin...@intel.com>; Michael Kubacki
<michael.kuba...@microsoft.com>; Andrew Fish (af...@apple.com)
<af...@apple.com>; Leif Lindholm <l...@nuviainc.com>
*Subject:* Re: [edk2-devel] Uncrustify Conversion Detailed Plan and
Extended Hard Freeze Update #4

Hey Mike,

While most of the changes related to fixing coding style violations,
there are a couple of changes to NetworkPkg in that PR that make the
code less readable. Examples below.

Example 1:



Example 2:


Example 3:


Example 4:

On 30-Nov-21 23:34, Michael D Kinney wrote:

      Hello,

      Thank you for your patience during this extended hard freeze.

      Just one more step to go.There has been a delay in the review of

      the patch series with the uncrustify source changes.PR(6).This

      patch series was not sent out as patch review email because of its

      very large size.It only contains source style changes and the

      CompareBuild tool and GitHub action has shown there are no binary

      differences introduced with these source style changes.

      If you are a package maintainer, then please review the following

      branch/PR for your package contents and review the EDK II CI results

      and BuildCompare results.I do not expect a line by line review

      because we already had time to provide feedback on the source style

      performed by uncrustify.Instead, a Reviewed-by for your package

      indicates that you have reviewed the EDK II CI results and CompareBuild

      tool functionality and results and you accept the source style

      changes to your package.

      
*https://github.com/mdkinney/edk2/tree/Bug_3737_3739_ApplyUncrustifyChanges_V5
<https://github.com/mdkinney/edk2/tree/Bug_3737_3739_ApplyUncrustifyChanges_V5>
      *https://github.com/tianocore/edk2/pull/2229  
<https://github.com/tianocore/edk2/pull/2229>

      *https://github.com/mdkinney/edk2/actions/runs/1521618836
<https://github.com/mdkinney/edk2/actions/runs/1521618836>
      Additional details on this update below.

      Thank you,

      Mike

      Changes from Update #3

      
----------------------------------------------------------------------------

      * Pushed PR (5)

      * Added link to PR(6). EDK II CI Status is PASS. Build Compare PASS.

      * Waiting for review of PR (6)

      * Review of PR (7) completed and waiting for review of PR (6)

      
----------------------------------------------------------------------------

      Changes from Update #2

      
----------------------------------------------------------------------------

      * Changed order of PRs swapping (4) and (5).The PR that activates

      increases the max CI agent job time is independent of all the other

      PRs and its review is complete, so it can be committed now.

      * Pushed PRs (1), (2), (3), (4).

      * Waiting for review to complete for PRs (5) and (6)

      * Reviews complete for PR (7)

      * Identifies steps using git filter-branch to apply uncrustify changes to 
a

      code review patch series that was generated before the uncrustify changes

      avoiding manual merge.

      * Identified steps using git filter-repo to generate an alternate history 
of

      the edk2 repo with uncrustify changes applied on every commit.This may

      be useful when evaluating changes to files using tools like git blame

      without the large uncrustify patch series.

      
---------------------------------------------------------------------------

      Changes from Update #1

      
----------------------------------------------------------------------------

      * Changed order of PRs swapping (6) and (7).The PR that activates

      EDK II CI check UncrustifyCheck has to be last because it unconditionally

      checks all C/H files in all packages.Not just files that have been

      modified like some of the other checkers.

      * Updated link to the branch with the UncrustifyCheck plugin that has been

      updated with a one line change and Reviewed-by and Tested-by tags.

      https://github.com/mdkinney/edk2/tree/Bug_3748_add_uncrustify_ci_plugin_v6
<https://github.com/mdkinney/edk2/tree/Bug_3748_add_uncrustify_ci_plugin_v6>
      * Reviews complete for (1), (2), (3), (5), and (7)

      
---------------------------------------------------------------------------

      Michael Kubacki and I have prepared the patches required to apply the

      uncrustify changes and enable EDK II CI to check all submitted

      patches have been run through uncrustify.

      We have verified through the CompareBuild GitHub Action that the

      format changes performed by uncrustify have no functional changes.

      All of the OBJ, LIB, DLL, EFI, FFS, FV, and FD files match 100%

      across 70 VS2019/GCC5 builds of all package/platform DSC files in

      the edk2 repo.

      The hard freeze will be extended after the edk2-stable202111 tag until

      all uncrustify related changes are committed.We do not expect this

      to take more than a few days.Do not push any PRs until the hard

      freeze is lifted.

      The changes are broken up into 7 patch series/PRs.The PRs are ordered

      so they can be submitted using the normal submission process and EDK II

      CI will pass for each one.Details are listed below.

      Uncrustify 73.0.3 for EDK II

      =============================

      * Sources:https://dev.azure.com/projectmu/_git/Uncrustify  
<https://dev.azure.com/projectmu/_git/Uncrustify>

      * 
Documentation:https://dev.azure.com/projectmu/Uncrustify/_wiki/wikis/Uncrustify.wiki/1/Project-Mu-(EDK-
II)-
Fork-
Readme  
<https://dev.azure.com/projectmu/Uncrustify/_wiki/wikis/Uncrustify.wiki/1/Project-Mu-(EDK-II)-Fork-Readme>
      * 
Download:https://dev.azure.com/projectmu/Uncrustify/_packaging?_a=package&feed=mu_uncrustify&package=mu-
uncrustify-release&protocolType=NuGet&version=73.0.3
<https://dev.azure.com/projectmu/Uncrustify/_packaging?_a=package&feed=mu_uncrustify&package=mu-uncrustify-
release&protocolType=NuGet&version=73.0.3>
      Installing Uncrustify

      ======================

      The Uncrustify tool is installed automatically when the Pytools

      environment is used and the stuart* commands are run to complete the

      environment setup.Please see:

      https://github.com/tianocore/edk2/tree/master/.pytool#running-ci-locally
<https://github.com/tianocore/edk2/tree/master/.pytool#running-ci-locally>
      Uncrustify can also be installed from the download page listed above

      or built from sources from the source link above.

      The Documentation link provides instruction on how to run uncrustify from

      the command line or install as a Visual Studio Code plugin.The main

      uncrustify documentation also describes how to integrate with a few other

      editors.

      We have also discussed a client side githook.That effort has not started.

      Let us know if that is a feature you would find useful.

      Developer impact for new code reviews

      ======================================

      Once the uncrustify checker is active in EDK II CI, developers must

      make sure their patches are run through the uncrustify tool before

      sending the patches for review.

      Developers must install and run uncrustify against changes files before

      sending patch review emails or submitting PR for EDK II CI.If EDK II CI

      detects and differences in source formatting, then EDK II CI will fail

      and the developer must run uncrustify and resubmit the patches.

      Developer impact to patch series/PRs reviewed during edk2-stable201121 
soft/hard freeze

      
=======================================================================================

      Developers must rebase their changes after the uncrustify source changes 
are

      committed.The branch with a preview of the uncrustify changes can be used

      to start this rebase work.

      
https://github.com/mdkinney/edk2/tree/Bug_3737_3739_ApplyUncrustifyChanges_V5
<https://github.com/mdkinney/edk2/tree/Bug_3737_3739_ApplyUncrustifyChanges_V5>
      The following steps can be used to update an existing branch with the

      required uncrustify format.This is the Windows version.I will add

      the Linux version soon.

      1) Fetch and checkout and rebase to latest edk2/master

      git fetch origin

      git checkout master

      git rebase origin/master

      2) Make a backup copy of plugin UncrustifyCheck outside WORKSPACE.

      (e.g. C:\Temp\UncrustifyCheck) so the uncrustify tool executable and

      EDK II specific uncrustify configuration file available when working

      with a branch that does not have those tools in its scope.

      xcopy .pytool\Plugin\UncrustifyCheck C:\Temp\UncrustifyCheck

      3) Check out the patch series branch (e.g. MyBranch)

      git checkout MyBranch

      4) Rebase patch series against edk2-stable202111



      git rebase edk2-stable202111

      5) Create new branch for the uncrustifed version (e.g. 
MyBranch_Uncrustified)

      git checkout -b MyBranch_Uncrustified

      6) Use git filter-branch to uncrustify all the commits in the series

      between the rebase target from (2) and HEAD of the branch.A filter

      can be used to scope the uncrustify operations to only the C/H files

      in the specific package the patch series is against. (e.g. 
DynamicTablesPkg).

      BaseTools should always be excluded.If the package scoped filter is

      not used, it will still work, but will take longer to run because

      uncrustify will rescan every C/H files in the whole repo.

      git filter-branch --tree-filter "git ls-files DynamicTablesPkg*.c 
DynamicTablesPkg*.h :!BaseTools/* |
c:\\Temp\\UncrustifyCheck\\mu-uncrustify-release_extdep\\Windows-x86\\uncrustify.exe
 -c
c:\\Temp\\UncrustifyCheck\\uncrustify.cfg -F - --replace --no-backup 
--if-changed" edk2-stable202111..HEAD
      7) Now that all the individual patches in the branch are uncrustified,

      rebase against latest edk2/master that is already uncrustified.

      git rebase master

      8) Verify the patches in this new branch.

      Impacts to tracing history across the uncrusity changes

      =======================================================

      Tools the view file and line history do work with the large uncrustify

      patch series.One impact is that the operations can be very slow due

      to the large uncrustify patches.

      One option to provide a faster experience is to provide an alternate

      version of the edk2 repository as "documentation" that has the

      entire history re-written with uncrustify run on every commit.

      The tool called git-filter-repo can be used to perform this

      transformation and runs in a reasonable period of time (a few hours)

      https://github.com/newren/git-filter-repo  
<https://github.com/newren/git-filter-repo>

      
https://github.com/newren/git-filter-repo/blob/main/contrib/filter-repo-demos/lint-history
<https://github.com/newren/git-filter-repo/blob/main/contrib/filter-repo-demos/lint-history>
      The following steps can be used to perform this transformation.

      This is the Windows version. I will add the Linux version soon.

      ** WARNING **This operation modifies(rewrites) all the commits

      in the local copy of the repo.Do not perform

      these steps on a local repo you are using for

      active development.

      1) Clone edk2 into a new directory (see **WARNING**)

      git clonehttps://github.com/tianocore/edk2.git  
<https://github.com/tianocore/edk2.git>  edk2-uncrustified

      cd edk2-uncrustified

      2) Setup python virtual env, install pytools, and run stuart commands

      to setup build environment which includes installing uncrustify tools.

      https://github.com/tianocore/edk2/tree/master/.pytool#running-ci-locally
<https://github.com/tianocore/edk2/tree/master/.pytool#running-ci-locally>
      3) Make a backup copy of plugin UncrustifyCheck outside WORKSPACE.

      (e.g. C:\Temp\UncrustifyCheck) so the uncrustify tool executable and

      EDK II specific uncrustify configuration file available when working

      with a branch that does not have those tools in its scope.

      xcopy .pytool\Plugin\UncrustifyCheck C:\Temp\UncrustifyCheck

      4) Use lint-history.py from git-filter-repo examples

      https://github.com/newren/git-filter-repo  
<https://github.com/newren/git-filter-repo>

      
https://github.com/newren/git-filter-repo/blob/main/contrib/filter-repo-demos/lint-history
<https://github.com/newren/git-filter-repo/blob/main/contrib/filter-repo-demos/lint-history>
      Line #127 - Add try except around subprocess.check_call() with except

      being pass.This is required because there are a few commits of C

      files in the edk2 repo that have incorrect C syntax and do not

      build with a C compiler and break the uncrustify parser.Skip reformat

      of C files that can not be parsed by uncrustify.These rare instances

      are addressed in the commit that fixes the C syntax error.

      Run this slightly modified version of lint-history.Include only

      C/H files and exclude directories that start with 'Tools' or 'BaseTools'.

      This step took about 2.2 hours on a laptop.

      lint-history.py

      --relevant "return (not filename.startswith(b'Tools') and not 
filename.startswith(b'BaseTools') and
(filename.endswith(b'.c') or filename.endswith(b'.h')))"
      
c:\\work\\GitHub\\tianocore\\foo\\UncrustifyCheck\\mu-uncrustify-release_extdep\\Windows-x86\\uncrustify.exe
-
c
c:\\work\\GitHub\\tianocore\\foo\\UncrustifyCheck\\uncrustify.cfg --replace 
--no-backup --if-changed
      Order of PRs to apply during extended hard freeze

      ==================================================

      1) Update EmulatorPkg Win Host [BuildOptions] MSFT CC_FLAGS to not force 
debug information

      *https://bugzilla.tianocore.org/show_bug.cgi?id=3747  
<https://bugzilla.tianocore.org/show_bug.cgi?id=3747>

      
*https://github.com/mdkinney/edk2/tree/Bug_3747_EmulatorPkg_WinHost_ReproducibleBuild
<https://github.com/mdkinney/edk2/tree/Bug_3747_EmulatorPkg_WinHost_ReproducibleBuild>
      *https://github.com/tianocore/edk2/pull/2215  
<https://github.com/tianocore/edk2/pull/2215>

      * Required for EmulatorPkg to pass CompareBuild for VS2019 IA32/X64 
builds.

      * Status: Review complete.PR pushed.

      2) EccCheck should not revert staged and local changes

      *https://bugzilla.tianocore.org/show_bug.cgi?id=2986  
<https://bugzilla.tianocore.org/show_bug.cgi?id=2986>

      *https://github.com/mdkinney/edk2/tree/Bug_2986_EccCheckRemoveGitRevert_V2
<https://github.com/mdkinney/edk2/tree/Bug_2986_EccCheckRemoveGitRevert_V2>
      *https://github.com/tianocore/edk2/pull/2216  
<https://github.com/tianocore/edk2/pull/2216>

      * Required for EDK II CI to complete in a reasonable period of time when

      processing the 4000+ source file style changes made by uncrustify.

      * Also fixes critical bugs that can potentially corrupt git state when

      EccCheck is run locally.

      * Status: Review complete.PR pushed.

      3) Update pytool LicenseCheck plugin to use temp directory for diff 
output file

      *https://bugzilla.tianocore.org/show_bug.cgi?id=3746  
<https://bugzilla.tianocore.org/show_bug.cgi?id=3746>

      
*https://github.com/mdkinney/edk2/tree/Bug_3746_LicenseCheckUseDiffOutputFile_V2
<https://github.com/mdkinney/edk2/tree/Bug_3746_LicenseCheckUseDiffOutputFile_V2>
      *https://github.com/tianocore/edk2/pull/2217  
<https://github.com/tianocore/edk2/pull/2217>

      * Required to reduce EDK II CI build times.

      * Status: Review complete.PR pushed.

      4) Update max job time from 60 min to 120 minutes in 
.azurepipelines/templates

      *https://bugzilla.tianocore.org/show_bug.cgi?id=3750  
<https://bugzilla.tianocore.org/show_bug.cgi?id=3750>

      
*https://github.com/mdkinney/edk2/tree/Bug_3750_IncreaseAzurePipelinesTimeout
<https://github.com/mdkinney/edk2/tree/Bug_3750_IncreaseAzurePipelinesTimeout>
      *https://github.com/tianocore/edk2/pull/2219  
<https://github.com/tianocore/edk2/pull/2219>

      * Required to allow EccCheck of uncrustify changes to complete on Azure

      Pipelines CI agents without timing out.

      * Status: Review complete.PR pushed.

      5) Update Package YAML to ignore specific ECC files/errors

      *https://bugzilla.tianocore.org/show_bug.cgi?id=3749  
<https://bugzilla.tianocore.org/show_bug.cgi?id=3749>

      *https://github.com/mdkinney/edk2/tree/Bug_3749_EccCheckIgnoreFilesErrors
<https://github.com/mdkinney/edk2/tree/Bug_3749_EccCheckIgnoreFilesErrors>
      *https://github.com/tianocore/edk2/pull/2218  
<https://github.com/tianocore/edk2/pull/2218>

      * Required to pass EccCheck

      * Status: Review complete. PR pushed

      6) Uncrustify Source Changes

      *https://bugzilla.tianocore.org/show_bug.cgi?id=3737  
<https://bugzilla.tianocore.org/show_bug.cgi?id=3737>

      *https://bugzilla.tianocore.org/show_bug.cgi?id=3739  
<https://bugzilla.tianocore.org/show_bug.cgi?id=3739>

      
*https://github.com/mdkinney/edk2/tree/Bug_3737_3739_ApplyUncrustifyChanges_V5
<https://github.com/mdkinney/edk2/tree/Bug_3737_3739_ApplyUncrustifyChanges_V5>
      *https://github.com/tianocore/edk2/pull/2229  
<https://github.com/tianocore/edk2/pull/2229>

      * Build comparison result 
PASS:https://github.com/mdkinney/edk2/actions/runs/1521618836
<https://github.com/mdkinney/edk2/actions/runs/1521618836>
      * EFI_D_ -> DEBUG changes required to pass PatchCheck

      * Uncrustify format changes required to pass UncrustifyCheck

      * Status:

      Waiting for review

      7) UncrustifyCheck EDK II CI Plugin

      *https://bugzilla.tianocore.org/show_bug.cgi?id=3748  
<https://bugzilla.tianocore.org/show_bug.cgi?id=3748>

      
*https://github.com/mdkinney/edk2/tree/Bug_3748_add_uncrustify_ci_plugin_v6
<https://github.com/mdkinney/edk2/tree/Bug_3748_add_uncrustify_ci_plugin_v6>
      * Required to enforce all PRs submitted to EDK II CI match uncrustify 
format.

      * Unconditionally checks all packages.Can not be committed until all C/H

      source files have been updated.

      * Status: Review complete

      Combined Branch/PR for Review/Test

      ==================================

      * Build Comparison results must pass 100% across the full set of PRs 
before

      the individual PRs can be pushed in the order listed above.

      * 
Branch:https://github.com/mdkinney/edk2/tree/TestOnly_Uncrustify_PR_Series
<https://github.com/mdkinney/edk2/tree/TestOnly_Uncrustify_PR_Series>
      * PR:https://github.com/tianocore/edk2/pull/2229  
<https://github.com/tianocore/edk2/pull/2229>

      Status = PASS

      * CompareBuild:

      
Branch:https://github.com/mdkinney/edk2/tree/Bug_3737_3739_ApplyUncrustifyChanges_V5
<https://github.com/mdkinney/edk2/tree/Bug_3737_3739_ApplyUncrustifyChanges_V5>
      --ref1:ef9a059cdb15844fe52a49af2bf7d86b9dd3e9bf

      --ref2:Bug_3737_3739_ApplyUncrustifyChanges_V5

      Extra Options: -n 4 --quiet

      Results:https://github.com/mdkinney/edk2/actions/runs/1521618836
<https://github.com/mdkinney/edk2/actions/runs/1521618836>
      30 VS2019 build comparisons PASS

      40 GCC5 build comparisons PASS

      100% PASS

      The following git log shows the set of patches from --ref1 to --ref 
2across

      which there are no differences in any of the OBJ/LIB/DLL/EFI/FFS/FV/FD 
files.

      --ref2

      b7d4bf0675b7 (HEAD -> Bug_3737_3739_ApplyUncrustifyChanges_V5) 
UnitTestFrameworkPkg: Apply uncrusitify
changes
      7f03d25f60e7 UefiPayloadPkg: Apply uncrusitify changes

      0bfd8d9b5ac9 UefiCpuPkg: Apply uncrusitify changes

      e1cd9bfb9dea StandaloneMmPkg: Apply uncrusitify changes

      5da2f65be378 SourceLevelDebugPkg: Apply uncrusitify changes

      95b86de07e5d SignedCapsulePkg: Apply uncrusitify changes

      fe71d97246c4 ShellPkg: Apply uncrusitify changes

      54c21c952992 SecurityPkg: Apply uncrusitify changes

      187a3785f12b RedfishPkg: Apply uncrusitify changes

      810100002a46 PcAtChipsetPkg: Apply uncrusitify changes

      276a695c0cf2 OvmfPkg: Apply uncrusitify changes

      303c0a91ab07 NetworkPkg: Apply uncrusitify changes

      bc80792cd1b1 MdePkg: Apply uncrusitify changes

      3ea86be17a2a MdeModulePkg: Apply uncrusitify changes

      c70ef11ed0cd IntelFsp2WrapperPkg: Apply uncrusitify changes

      c0291221f252 IntelFsp2Pkg: Apply uncrusitify changes

      6a479952a690 FmpDevicePkg: Apply uncrusitify changes

      3a7c05b7070d FatPkg: Apply uncrusitify changes

      b789f98c8959 EmulatorPkg: Apply uncrusitify changes

      952d7a1c9220 EmbeddedPkg: Apply uncrusitify changes

      a1cc9881bab6 DynamicTablesPkg: Apply uncrusitify changes

      50654dfe5785 CryptoPkg: Apply uncrusitify changes

      ed965a02dfa1 ArmVirtPkg: Apply uncrusitify changes

      9744023fbc46 ArmPlatformPkg: Apply uncrusitify changes

      7a1cde5f5bba ArmPkg: Apply uncrusitify changes

      19d17e0913e8 UefiCpuPkg: Change use of EFI_D_* to DEBUG_*

      ffa718b4f994 SourceLevelDebugPkg: Change use of EFI_D_* to DEBUG_*

      b86cb3c5e5b4 ShellPkg: Change use of EFI_D_* to DEBUG_*

      c7c42204dc07 SecurityPkg: Change use of EFI_D_* to DEBUG_*

      16b8e6f958e4 PcAtChipsetPkg: Change use of EFI_D_* to DEBUG_*

      0ac3f8b2dac5 OvmfPkg: Change use of EFI_D_* to DEBUG_*

      bc5004b8d294 NetworkPkg: Change use of EFI_D_* to DEBUG_*

      6f671a8e2377 MdePkg: Change use of EFI_D_* to DEBUG_*

      a10c610ff9a3 MdeModulePkg: Change use of EFI_D_* to DEBUG_*

      09a3bddba390 FatPkg: Change use of EFI_D_* to DEBUG_*

      59c61318246a EmulatorPkg: Change use of EFI_D_* to DEBUG_*

      3a80367dda3b EmbeddedPkg: Change use of EFI_D_* to DEBUG_*

      23eb1aaf80ca ArmVirtPkg: Change use of EFI_D_* to DEBUG_*

      875914b45c54 ArmPlatformPkg: Change use of EFI_D_* to DEBUG_*

      eb2eca82b451 ArmPkg: Change use of EFI_D_* to DEBUG_*

      f0f3f5aae7c4 (origin/master, origin/HEAD, master) UnitTestFrameworkPkg: 
Update YAML to ignore specific ECC
files/errors
      c05734797790 UefiPayloadPkg: Update YAML to ignore specific ECC 
files/errors

      c30c40d6c63d StandaloneMmPkg: Update YAML to ignore specific ECC 
files/errors

      9944508e85f1 ShellPkg: Update YAML to ignore specific ECC files/errors

      60fa40be458d SecurityPkg: Update YAML to ignore specific ECC files/errors

      df790cd6b37e MdePkg: Update YAML to ignore specific ECC files/errors

      9deb9370766e MdeModulePkg: Update YAML to ignore specific ECC files/errors

      d7d30e8f219f EmulatorPkg: Update YAML to ignore specific ECC files/errors

      d5744ecba813 CryptoPkg: Update YAML to ignore specific ECC files/errors

      c97fee87f0f9 ArmVirtPkg: Update YAML to ignore specific ECC files/errors

      1939fc9569f2 ArmPlatformPkg: Update YAML to ignore specific ECC 
files/errors

      365dced2c37a ArmPkg: Update YAML to ignore specific ECC files/errors

      76a1ce4d5fec .azurepipelines/templates: Update max pipeline job time to 2 
hours

      99f84ff47390 .pytools/Plugin/LicenseCheck: Use temp directory for git 
diff output

      3019f1bbabf1 .pytool/Plugin/EccCheck: Add performance optimizations

      854462bd3479 .pytool/Plugin/EccCheck: Remove temp directory on exception

      69877614fdee .pytool/Plugin/EccCheck: Remove RevertCode()

      --ref1

      ef9a059cdb15 EmulatorPkg/Win/Host: Update CC_FLAGS

      bb1bba3d7767 (tag: edk2-stable202111) NetworkPkg: Fix invalid pointer for 
DNS response token on error

      Best regards,

      Mike









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


Reply via email to