On Mon, Apr 30, 2012 at 03:36:17PM +0200, Ulrich Mueller wrote:
> >>>>> On Mon, 30 Apr 2012, Thomas Sachau wrote:
> 
> > Krzysztof Pawlik schrieb:
> >> On 30/04/12 10:39, Ulrich Mueller wrote:
> >>>>> If the eclass doesn't work with FEATURES="collision-protect"
> >>>>> then it needs to be fixed.
> >>> 
> >>>> Long story short: older eclass compiled Python byte code in live
> >>>> file system, new one does it in src_install so .pyo/.pyc gets
> >>>> properly recorded, so the package *has to overwrite* files that
> >>>> are not owned by anyone  (no package owns them).
> >>> 
> >>> The usual approach to this problem was to have some cleanup code
> >>> in pkg_setup or pkg_preinst that would remove the old files.
> >> 
> >> Interesting idea - I see two problems:
> >> - how I would get the list of files for already installed version
> >> (the file list can (and will) differ between versions)
> 
> > Simple workaround in pkg_preinst (just example code, nothing to
> > copy/paste):
> 
> > if has_version < first_good_version ; then
> >     for i in $(find ${D} -name *.{pyc,pyo}) ; do
> >             [[ -e ${i/${D}/${ROOT}/} ]] && rm ${i/${D}/${ROOT}/}
> >     done
> > fi
> 
> This wouldn't work, because collision protection runs _before_
> pkg_preinst.
> 
> However, one could imagine a (somewhat dirty) workaround:
> - At the end of src_install, rename all *.pyc and *.pyo in ${D} to
>   names that don't collide with the ones in ${ROOT}, so that collision
>   protection won't be triggered.
> - At the beginning of pkg_preinst, rename them back to their original
>   names.
> - Run above code.
> 
> > Alternatively, you could take all .py files of the installed
> > versions and blindly remove the pyo/pyc files for them in
> > pkg_preinst (this should also prevent leaving dead files around).
> 
> s/preinst/setup/ otherwise the same argument as above would apply.

The checks above can misbehave.

Pretty sure I've already suggested this route for this specific issue, 
but QA vars in the ebuild that portage can use for hints is a sane, 
non-cluster-fucky way to deal with this.  Something along the lines of 
QA_COLLISION_PROTECT_IGNORE='*.pyc'

Still has the potential for things going boom, but warnings can be 
setup for when collision-protect is on, and the portage version 
doesn't look new enough (those being details; point is the general 
approach).
~harring

Reply via email to