Page MenuHomeFreeBSD

WIP: check for REINPLACE_CMD usage that doesn't do anything
ClosedPublic

Authored by swills on Oct 29 2019, 4:12 PM.

Details

Summary

There are many places in ports where REINPLACE_CMD is used but doesn't do anything. It's a frequent source of issues. This adds way to check that the REINPLACE_CMD made a change and complain about it if not.

Diff Detail

Repository
rP FreeBSD ports repository
Lint
Lint Skipped
Unit
Unit Tests Skipped

Event Timeline

swills retitled this revision from check for REINPLACE_CMD usage that doesn't do anything to WIP: check for REINPLACE_CMD usage that doesn't do anything.Oct 29 2019, 4:22 PM
bdrewery added inline comments.
Tools/scripts/sed_checked.sh
8

[ -f $blah ] doesn't generate output so the redirections aren't needed.

9–16

You quoted the first if [ -f but then lost quotes everywhere else. It will be significant with filenames with spaces or globbing characters. Unlikely but trivial to avoid the problem.

Mk/bsd.port.mk
2016

Is there a review dependency missing here? I'm not sure what FRAMEWORK_REINPLACE_CMD is.

I had added FRAMEWORK_REINPLACE_CMD as a way to avoid warnings from REINPLACE_CMD but haven't submitted a review for it yet because I'm not sure it's needed if this is going to just be a warning. But if you want, see:

https://reviews.freebsd.org/differential/diff/63739/

Thanks for taking a look, I think the other comments should be addressed. Better, but still needs work.

mat added inline comments.
Mk/bsd.port.mk
1621–1622

Why add WRKDIR and WRKSRC, it is not using it.

2012

REWARNFILE should be defined once and not have magic values here and there :-)

Tools/scripts/sed_checked.sh
8–9
if !cmp "${x}" "${x}".bak > /dev/null 2>&1; then

(or maybe without the !, not sure)

swills marked an inline comment as done.

In my testing, this finds a large number of errors and of various types. The only issue I've found with it so far is places were we replace /usr/local with LOCALBASE or PREFIX which is also /usr/local, which produces a false alarm from this script. On the other hand, it finds a large number of real problems of various types. One example is this:

https://svnweb.freebsd.org/ports/head/print/alignmargins/files/patch-alignmargins?r1=127541&r2=127691

where the committer accidentally changed LOCALBASE to /usr/local, and no one has noticed for 14 years. Another is sysutils/and which patches a file then calls REINPLACE_CMD on it to replace what it patched into the file. And another is www/amphetadesk which calls REINPLACE_CMD on every file in WRKSRC, including images.

So I do find this to be a really useful check and would like to commit it soon.

Mk/Scripts/qa.sh
5–6

Not sure this change is needed. We're only checking for the 3 most important variables. And even then, qa.sh is only run from one place, where those three variables are always defined.

In any way, REWARNFILE is always added to the environment in bsd.port.mk, so I feel this is not needed.

Tools/scripts/sed_checked.sh
6

cmp as a silent mode:

if cmp -s "${x}" "${x}".bak ; then
swills marked an inline comment as done.
tobik added inline comments.
Tools/scripts/sed_checked.sh
3

This script always has exit status 0 which means that the blackbox
behavior now differs when DEVELOPER is set and when it is not. If
I introduce a syntax error in a sed expression the build will
continue unpatched anyway when it probably should abort like before.
Maybe add set -e or || exit 1 to the script or handle the error
case in some other way.

8

Every file flagged here will always be prefixed with ${WRKDIR} which
seems redundant. WRKDIR can also be a pretty long path. Would it
make sense to strip it like what is done in the shebang and symlink
checks in qa.sh?

swills marked 2 inline comments as done.

Address comments.

Tools/scripts/sed_checked.sh
3

Sure, that's fine.

8

Good idea.

Went to commit this and realized I missed a few changes I'd added to avoid issues/false positives from USES, adding those to the diff.

This revision is now accepted and ready to land.Jan 7 2020, 8:54 AM
This revision was automatically updated to reflect the committed changes.