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. > >