Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 19 Jun 2004 14:46:36 +0200
From:      Thomas-Martin Seck <tmseck-lists@netcologne.de>
To:        Oliver Eikemeier <eikemeier@fillmore-labs.com>
Cc:        freebsd-ports@freebsd.org
Subject:   Re: CONFLICTS usage question
Message-ID:  <20040619124636.GD568@laurel.tmseck.homedns.org>
In-Reply-To: <3D4C2946-C1E9-11D8-9250-00039312D914@fillmore-labs.com>
References:  <20040619114707.GC568@laurel.tmseck.homedns.org> <3D4C2946-C1E9-11D8-9250-00039312D914@fillmore-labs.com>

next in thread | previous in thread | raw e-mail | index | archive | help
* Oliver Eikemeier (eikemeier@fillmore-labs.com):

> Thomas-Martin Seck wrote:
> 
> >* Oliver Eikemeier (eikemeier@fillmore-labs.com):
> >
> >>Besides that your `workaround' has problems (as stated above), try the
> >>attached ports:
> >>
> >> cd /usr/ports/misc/conflicttest2
> >>do
> >> make clean deinstall reinstall
> >>multiple times. Then do
> >> make CONFLICT_WITH_SELF=yes clean deinstall reinstall
> >>
> >>See the difference? Other examples are possible, but this is probably
> >>the most trivial one. Furthermore, you get a different error message,
> >>which is confusing for the novice user.

Do you mean that we get a "conflicts with ${PKGNAME}" instead of "is
already installed". This is confusing, of course.

> >So, let's try to get this discussion less emotional and more technical:
> >
> >We have a situation where conflicttest-2 has a build dependency on
> >conflicttest-1. conflicttest-1 conflicts with itself.
> 
> Yep.
> 
> >So we want to forcibly reinstall conflicttest-2 and define
> >FORCE_PKG_REGISTER.
> 
> Nope. See above: you just deinstall and reinstall conflicttest2. No
> FORCE_PKG_REGISTER on the command line involved.

In this case, it luckily makes no difference, the self-conflict shows
up, as described. Sorry for modifying the example.

> >This will in in turn force conflicttest-1 to be
> >built and installed, too.
> >
> >Because conflicttest-1 conflicts with itself, the installation of
> >conflicttest-1 fails with "conflicts with itself" which is, admittedly a
> >rather confusing, though technically correct message.
> >
> >If we disable conflicts checking, everything "works", but if
> >conflicttest-2 were to conflict with some/port we would not have
> >caught and we might have hosed some/port. Not good.
> 
> Plus, you have to set DISABLE_CONFLICTS in the above example, which
> will just work when conflicttest1 does not conflict with itself.
> 
> >So the more interesting problem is: is there a way to make the conflicts
> >generation/check immune to the self-conflict problem.
> 
> Of course there is, but is it worth the effort? Or, put the other way
> around: what will this buy us?

In my opinion bsd.port.mk should follow the robustness principle: be
liberal with regard to the CONFLICTS pattern and silently discard a
self-conflict (if it is as easy to spot as I think). I think portmgr's
and/or the ports committer's time is simply spent better with improving
bsd.port.mk than with chasing down CONFLICTS bugs in >10000 individual
ports. Don't forget that maintainers are humans and that the ports
system is in general rather liberal.

> >The way the
> >conflicts file is generated is rather primitive: the CONFLICTS pattern
> >is fed to ls(1) and that's it.
> 
> IMHO this is buggy. See PR 59696 for an improved version.

I do not really like the approach taken there, I'm afraid.

> >How about checking whether we have a
> >self-conflict and omit this case:
> >
> >Index: bsd.port.mk
> >===================================================================
> >RCS file: /home/ncvs/ports/Mk/bsd.port.mk,v
> >retrieving revision 1.491
> >diff -u -r1.491 bsd.port.mk
> >--- bsd.port.mk	10 Jun 2004 07:30:19 -0000	1.491
> >+++ bsd.port.mk	19 Jun 2004 11:42:27 -0000
> >@@ -3084,7 +3084,7 @@
> > 	@${RM} -f ${WRKDIR}/.CONFLICTS
> > .for conflict in ${CONFLICTS}
> > 	@found="`${LS} -d ${PKG_DBDIR}/${conflict} 2>/dev/null || 
> >${TRUE}`"; \
> >-	if [ X"$$found" != X"" ]; then \
> >+	if [ X"$$found" != X"" -a "$$found" != 
> >"${PKG_DBDIR}/${PKGNAME}" ]; then \
> > 		${ECHO_CMD} "$$found" >> ${WRKDIR}/.CONFLICTS; \
> > 	fi
> > .endfor
> >
> >(PKGNAME may not coarse enough as the check criterium since we will miss
> >the "port conflicts with an older version of itself", but you get the
> >idea. Does that sound feasible?)
> 
> It is feasible. You could check PKGORIGINS or do the 
> check-already-installed test
> before check-conflicts, filtering out previous results. The question 
> remains:
> Why?

Well, why not? If the already-installed check is done beforehand, the
self-conflict message does not show up and the user is not confused.

If (s)he forces the reinstall, the self-conflict is silently discarded
and the user is still not confused (at least not by the ports system).

I definitely think this is worth pursuing.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20040619124636.GD568>