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