Hello fellow devs,

I've been experimenting with different ideas for conquering the whitespace 
beast, and am trying to keep things as simple as possible.  After a few 
iterations, here is what I have for the main cleanup command (to be run from 
Open-ILS/src/perlmods/lib):

find . -name "*.pm" \
-exec sh -c 'sed "/<</s/\t/    /g" < {} \
| expand -t 4 > {}.fixed ; \
cp --no-preserve=mode,ownership {}.fixed {}; \
rm {}.fixed' \;

Here is the thinking behind each line:
1. Find all the Perl module files (I thought we might have some .pl files in 
there, but we do not).  This might miss a strangely named file or two, but in 
the interest of simplicity, I think that is fine.
2. Replace tabs used in heredoc starting statements with a constant 4 spaces 
(expand is too smart and preserves actual spacing, which in this case gives us 
a good chance of *not* matching the closing heredoc marker).  We don't care 
about the closing marker, since those always start at the beginning of the 
line, so expand works fine for those.
3. Use the 'expand' command to turn all tabs into the equivalent number of 
spaces with a tabstop of 4.  This does go beyond the initial goal of fixing 
initial tabs only, but in testing, expand seemed to do everything right, so we 
should take advantage of the opportunity.
4. cp the 'fixed' files over the originals.  We are using cp instead of mv here 
so that we can preserve the attributes of the *original* file (at least one 
file would otherwise lose its executable bits).  It seems like 
'--no-preserve=mode' is the default cp behavior when overwriting, but it 
doesn't hurt to be explicit.
5. Remove the now extra 'fixed' files.

This results in a pretty big change, somewhere around 30,000 lines.  This is 
about 27% of the total lines in the .pm files.  Nevertheless, I encountered no 
problems in brief testing.  More testing is *highly* encouraged.

As for dealing with this change for later merges, I've had good luck doing the 
following:

1. Rebase the to-be-merged branch to the origin/master (post whitespace fix) 
using the --ignore-whitespace option.  This is not compatible with 
--interactive, so do that separately, if needed.
2. Run the "fix" command set again.  This will find and clean up any whitespace 
issues being re-introduced in the new/updated lines from the merge.
3. Tack on a whitespace-only commit with whatever the "fix" fixes.

Again, more testing is welcome.

While it is simple to generate the changes yourself, I have pushed a branch 
here:

http://git.evergreen-ils.org/?p=working/Evergreen.git;a=shortlog;h=refs/heads/user/dbwells/whitespace_fixup_m1

My intention is to push the whitespace commit after the cutoff tomorrow 
afternoon.  If you see or run into any issues, please speak up!  I would also 
be happy to get a sign-off or two, but please be aware that you are really 
signing off on the process, not the actual commit, as the "fix" will only be 
effective if it is re-run to catch any changes to master between now and then.

Thanks as always,
Dan

Reply via email to