summaryrefslogtreecommitdiff
blob: 95278ebef4ebf1b0bc5b5ab51389121310c30d83 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
# Copyright 2005-2010 Gentoo Foundation
# Distributed under the terms of the GNU General Public License, v2 or later
# $Header: /var/cvsroot/gentoo-x86/eclass/twisted.eclass,v 1.8 2010/10/10 19:39:49 arfrever Exp $

# @ECLASS: twisted.eclass
# @MAINTAINER:
# Gentoo Python Project <python@gentoo.org>
# @BLURB: Eclass for Twisted packages
# @DESCRIPTION:
# The twisted eclass defines phase functions for Twisted packages.

# The following variables can be set in dev-python/twisted* packages before inheriting this eclass:
#   MY_PACKAGE - Package name suffix (required)
#   MY_PV      - Package version (optional)

inherit distutils versionator

EXPORT_FUNCTIONS src_install pkg_postinst pkg_postrm

if [[ "${CATEGORY}/${PN}" == "dev-python/twisted"* ]]; then
	EXPORT_FUNCTIONS src_test

	MY_PV="${MY_PV:-${PV}}"
	MY_P="Twisted${MY_PACKAGE}-${MY_PV}"

	HOMEPAGE="http://www.twistedmatrix.com/"
	SRC_URI="http://tmrc.mit.edu/mirror/twisted/${MY_PACKAGE}/$(get_version_component_range 1-2 ${MY_PV})/${MY_P}.tar.bz2"

	LICENSE="MIT"
	SLOT="0"
	IUSE=""

	S="${WORKDIR}/${MY_P}"

	TWISTED_PLUGINS="${TWISTED_PLUGINS:-twisted.plugins}"
fi

# @ECLASS-VARIABLE: TWISTED_PLUGINS
# @DESCRIPTION:
# Twisted plugins, whose cache is regenerated in pkg_postinst() and pkg_postrm() phases.

twisted_src_test() {
	if [[ "${CATEGORY}/${PN}" != "dev-python/twisted"* ]]; then
		die "${FUNCNAME}() can be used only in dev-python/twisted* packages"
	fi

	testing() {
		local sitedir="${EPREFIX}$(python_get_sitedir)"

		# Copy modules of other Twisted packages from site-packages directory to temporary directory.
		mkdir -p "${T}/${sitedir}"
		cp -R "${ROOT}${sitedir}/twisted" "${T}/${sitedir}" || die "Copying of modules of other Twisted packages failed with $(python_get_implementation) $(python_get_version)"
		rm -fr "${T}/${sitedir}/${PN/-//}"

		# Install modules of current package to temporary directory.
		"$(PYTHON)" setup.py build -b "build-${PYTHON_ABI}" install --force --no-compile --root="${T}" || die "Installation into temporary directory failed with $(python_get_implementation) $(python_get_version)"

		pushd "${T}/${sitedir}" > /dev/null || return 1
		PATH="${T}${EPREFIX}/usr/bin:${PATH}" PYTHONPATH="${T}/${sitedir}" trial ${PN/-/.} || return 1
		popd > /dev/null || return 1

		rm -fr "${T}/${sitedir}"
	}
	python_execute_function testing
}

twisted_src_install() {
	distutils_src_install

	if [[ -d doc/man ]]; then
		doman doc/man/*
	fi

	if [[ -d doc ]]; then
		insinto /usr/share/doc/${PF}
		doins -r $(find doc -mindepth 1 -maxdepth 1 -not -name man)
	fi
}

_twisted_update_plugin_cache() {
	local dir exit_status="0" module

	for module in ${TWISTED_PLUGINS}; do
		if [[ -d "${EROOT}$(python_get_sitedir -b)/${module//.//}" ]]; then
			find "${EROOT}$(python_get_sitedir -b)/${module//.//}" -name dropin.cache -print0 | xargs -0 rm -f
		fi
	done

	if [[ -n "$(type -p "$(PYTHON)")" ]]; then
		for module in ${TWISTED_PLUGINS}; do
			# http://twistedmatrix.com/documents/current/core/howto/plugin.html
			"$(PYTHON)" -c \
"import sys
sys.path.insert(0, '${EROOT}$(python_get_sitedir -b)')

try:
	import twisted.plugin
	import ${module}
except ImportError:
	if '${EBUILD_PHASE}' == 'postinst':
		raise
	else:
	    # Twisted, zope.interface or given plugins might have been uninstalled.
		sys.exit(0)

list(twisted.plugin.getPlugins(twisted.plugin.IPlugin, ${module}))" || exit_status="1"
		done
	fi

	for module in ${TWISTED_PLUGINS}; do
		# Delete empty parent directories.
		local dir="${EROOT}$(python_get_sitedir -b)/${module//.//}"
		while [[ "${dir}" != "${EROOT%/}" ]]; do
			rmdir "${dir}" 2> /dev/null || break
			dir="${dir%/*}"
		done
	done

	return "${exit_status}"
}

twisted_pkg_postinst() {
	distutils_pkg_postinst
	python_execute_function \
		--action-message 'Regeneration of Twisted plugin cache with $(python_get_implementation) $(python_get_version)' \
		--failure-message 'Regeneration of Twisted plugin cache failed with $(python_get_implementation) $(python_get_version)' \
		--nonfatal \
		_twisted_update_plugin_cache
}

twisted_pkg_postrm() {
	distutils_pkg_postrm
	python_execute_function \
		--action-message 'Regeneration of Twisted plugin cache with $(python_get_implementation) $(python_get_version)' \
		--failure-message 'Regeneration of Twisted plugin cache failed with $(python_get_implementation) $(python_get_version)' \
		--nonfatal \
		_twisted_update_plugin_cache
}