On Sat, Jun 13, 2020 at 06:46:27PM +0200, Klemens Nanni wrote:
> For small ports not so much, but when updating bigger ones with lots of
> patches and/or churn, I always find cumbersome to go scroll back in my
> terminal to look for failed hunks or cd into WRKSRC and look for .rej
> files, so here's a diff that prints the list of failed patches iff there
> are any, e.g.,
>
> $ make patch
> ...
> Hunk #1 succeeded at 22.
> done
> ===> Failed patches:
> patch-src_tests_hitch_test_sh
>
> *** Error 1 in . (/usr/ports/infrastructure/mk/bsd.port.mk:2793
> '/usr/ports/pobj/hitch-1.5.2/.patch_done': @if cd /p/security/hitch/patches
> ...)
> *** Error 2 in /p/security/hitch
> (/usr/ports/infrastructure/mk/bsd.port.mk:2581 'patch': @lock=hitch-1.5.2;
> export _LOCKS_HELD=" hitch-1.5....)
>
> It seems that 'echo' is used for errors in bsd.port.mk targets instead
> of ${ECHO_MSG}, but other shell syntax seem used inconsistently, so I
> just went with 'echo' to always print the error/list and used && instead
> of if/else as is with the `error' variable.
>
> I'm also deliberately using backslashes and the fact that sh's echo
> interprets them instead of doing a for loop over $failed_patches in the
> end.
>
> Feedback? OK?
The idea looks fine, I"m not quite sure it works nor is perfect.
[ ] && echo will only succeed if the first part succeeds, ouch.
I would just display failed patches if $$error, the "can't find patch matching
$$i" happens so seldom that it won't be confusing.
You do not need to initialize the variable.
>
> Index: infrastructure/mk/bsd.port.mk
> ===================================================================
> RCS file: /cvs/ports/infrastructure/mk/bsd.port.mk,v
> retrieving revision 1.1540
> diff -u -p -r1.1540 bsd.port.mk
> --- infrastructure/mk/bsd.port.mk 9 Jun 2020 11:01:08 -0000 1.1540
> +++ infrastructure/mk/bsd.port.mk 13 Jun 2020 16:39:43 -0000
> @@ -2758,6 +2758,7 @@ ${_PATCH_COOKIE}: ${_EXTRACT_COOKIE}
> @${_MAKE} _internal-distpatch
> . endif
> @if cd ${PATCHDIR} 2>/dev/null || [ x"${PATCH_LIST:M/*}" != x"" ]; then
> \
> + failed_patches=''; \
> error=false; \
> for i in ${PATCH_LIST}; do \
> case $$i in \
> @@ -2773,6 +2774,7 @@ ${_PATCH_COOKIE}: ${_EXTRACT_COOKIE}
> if [ -s $$i ]; then \
> ${_PBUILD} ${PATCH}
> ${PATCH_ARGS} < $$i || \
> { echo "***>
> $$i did not apply cleanly"; \
> +
> failed_patches="$$failed_patches\n $$i"; \
> error=true; }; \
> else \
> ${ECHO_MSG} "===>
> Ignoring empty patchfile $$i"; \
> @@ -2786,6 +2788,7 @@ ${_PATCH_COOKIE}: ${_EXTRACT_COOKIE}
> ;; \
> esac; \
> done;\
> + [ -n "$$failed_patches" ] && echo "===> Failed patches:
> $$failed_patches\n"; \
> if $$error; then exit 1; fi; \
> fi
> # End of PATCH.
>
>