Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 3 Jun 2012 16:56:27 +0200 (CEST)
From:      Marcus von Appen <mva@freebsd.org>
To:        FreeBSD-gnats-submit@freebsd.org
Cc:        bapt@freebsd.org, python@freebsd.org, portmgr@freebsd.org
Subject:   [PATCH]: prevent checksum mismatches for compiled python files on installing python ports via the ports tree
Message-ID:  <201206031456.q53EuRvh089505@medusa.sysfault.org>

next in thread | raw e-mail | index | archive | help

>Submitter-Id:	current-users
>Originator:	Marcus von Appen
>Organization:	
>Confidential:	no 
>Synopsis:	[PATCH]: prevent checksum mismatches for compiled python files on installing python ports via the ports tree
>Severity:	non-critical
>Priority:	medium
>Category:	ports
>Class:		sw-bug
>Release:	FreeBSD 9.0-STABLE amd64
>Environment:
System: FreeBSD medusa.sysfault.org 9.0-STABLE FreeBSD 9.0-STABLE #0: Mon May 14 15:08:44 CEST 2012 root@medusa.sysfault.org:/usr/obj/usr/src/sys/MEDUSA amd64


	
>Description:

        The default configuration within bsd.python.mk installs python
        packages that use distutils or easy_install with byte-compiled
        files.

        The compiled (.pyc/.pyo) files contain a timestamp and magic
        number which are used as identicators for recompiling the files,
        if their original source (.py) differs in its st_mtime value or
        if Python's magic number changes.

        Whenever the byte-compiled files change, a checksum mismatch
        will be raised on deinstall or reinstalling the port.

        For a lengthy rant about this issue, check
            http://wiki.freebsd.org/Ports/Python/CompiledPackages

>How-To-Repeat:
	- install a python port that installs .pyc/.pyo files
        - slightly modify one of the original .py files - OR -
          - change the date/timestamp on the original file (using touch)
          - deinstall/reinstall the Python interpreter
        - (as root user) import the file as module in the python interpreter
        - deinstall the port

>Fix:

        The following fix introduces a new _CLEANUP_CONTENTS command
        chain, which is injected into the fake-pkg: target. It can be
        used to perform clean-up operations on the +CONTENTS file of
        the pkg_install toolchain.

        Within bsd.python.mk _CLEANUP_CONTENTS will be enhanced, so that
        the @comment MD5: entry for +CONTENTS entries, that denote a
        .pyc or .py file, is removed.

        The change will need an -exp run to verify that the installation
        and deinstallation still works for all ports.


Index: Mk/bsd.port.mk
===================================================================
RCS file: /home/pcvs/ports/Mk/bsd.port.mk,v
retrieving revision 1.724
diff -u -r1.724 bsd.port.mk
--- Mk/bsd.port.mk	31 May 2012 14:27:23 -0000	1.724
+++ Mk/bsd.port.mk	3 Jun 2012 12:24:32 -0000
@@ -5850,6 +5850,8 @@
 .endif
 .endif

+_CLEANUP_CONTENTS?=	${DO_NADA};
+
 # Fake installation of package so that user can pkg_delete it later.
 # Also, make sure that an installed port is recognized correctly in
 # accordance to the @pkgdep directive in the packing lists
@@ -5869,6 +5871,7 @@
 		${ECHO_MSG} "===>   Registering installation for ${PKGNAME}"; \
 		${MKDIR} ${PKG_DBDIR}/${PKGNAME}; \
 		${PKG_CMD} ${PKG_ARGS} -O ${PKGFILE} > ${PKG_DBDIR}/${PKGNAME}/+CONTENTS; \
+		${_CLEANUP_CONTENTS} \
 		${CP} ${DESCR} ${PKG_DBDIR}/${PKGNAME}/+DESC; \
 		${ECHO_CMD} ${COMMENT:Q} > ${PKG_DBDIR}/${PKGNAME}/+COMMENT; \
 		if [ -f ${PKGINSTALL} ]; then \
Index: Mk/bsd.python.mk
===================================================================
RCS file: /home/pcvs/ports/Mk/bsd.python.mk,v
retrieving revision 1.146
diff -u -r1.146 bsd.python.mk
--- Mk/bsd.python.mk	30 May 2012 14:54:34 -0000	1.146
+++ Mk/bsd.python.mk	3 Jun 2012 12:24:32 -0000
@@ -515,6 +515,10 @@
 PYDISTUTILS_EGGINFO?=	${PYDISTUTILS_PKGNAME:C/[^A-Za-z0-9.]+/_/g}-${PYDISTUTILS_PKGVERSION:C/[^A-Za-z0-9.]+/_/g}-py${PYTHON_VER}.egg-info
 PYDISTUTILS_EGGINFODIR?=${PYTHONPREFIX_SITELIBDIR}

+# Override bsd.port.mk's setting
+_CLEANUP_CONTENTS+=	\
+	${SED} -i -e '/\.py[co]$$/{n;d;}' ${PKG_DBDIR}/${PKGNAME}/+CONTENTS;
+
 .if !defined(PYDISTUTILS_NOEGGINFO) && \
 	(defined(INSTALLS_EGGINFO) ||	\
 		(defined(USE_PYDISTUTILS) && \



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