aboutsummaryrefslogtreecommitdiff
blob: 91f300637a20e8ebfbc0e797cf6290361baf98aa (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
# Copyright 2018-2019 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

import re

import portage
from portage import os
from portage.const import GLOBAL_CONFIG_PATH

COMPAT_DISTDIR = 'usr/portage/distfiles'
COMPAT_PKGDIR = 'usr/portage/packages'
COMPAT_MAIN_REPO = 'usr/portage'


def main():
	"""
	If the current installation is still configured to use any of the
	legacy default /usr/portage locations, then patch make.globals and
	repos.conf inside ${ED} to maintain compatible defaults. This is
	intended to be called from the ebuild as follows:

	pkg_preinst() {
		python_setup
		python_export PYTHON_SITEDIR
		env -u DISTDIR \
			-u PORTAGE_OVERRIDE_EPREFIX \
			-u PORTAGE_REPOSITORIES \
			-u PORTDIR \
			-u PORTDIR_OVERLAY \
			PYTHONPATH="${ED%/}${PYTHON_SITEDIR}${PYTHONPATH:+:${PYTHONPATH}}" \
			"${PYTHON}" -m portage._compat_upgrade.default_locations || die
	}
	"""
	out = portage.output.EOutput()
	config = portage.settings

	compat_distdir = os.path.join(portage.const.EPREFIX or '/', COMPAT_DISTDIR)
	try:
		do_distdir = os.path.samefile(config['DISTDIR'], compat_distdir)
	except OSError:
		do_distdir = False

	compat_pkgdir = os.path.join(portage.const.EPREFIX or '/', COMPAT_PKGDIR)
	try:
		do_pkgdir = os.path.samefile(config['PKGDIR'], compat_pkgdir)
	except OSError:
		do_pkgdir = False

	compat_main_repo = os.path.join(portage.const.EPREFIX or '/', COMPAT_MAIN_REPO)
	try:
		do_main_repo = os.path.samefile(config.repositories.mainRepoLocation(), compat_main_repo)
	except OSError:
		do_main_repo = False

	if do_distdir or do_pkgdir:
		config_path = os.path.join(os.environ['ED'], GLOBAL_CONFIG_PATH.lstrip(os.sep), 'make.globals')
		with open(config_path) as f:
			content = f.read()
			if do_distdir:
				compat_setting = 'DISTDIR="{}"'.format(compat_distdir)
				out.einfo('Setting make.globals default {} for backward compatibility'.format(compat_setting))
				content = re.sub('^DISTDIR=.*$', compat_setting, content, flags=re.MULTILINE)
			if do_pkgdir:
				compat_setting = 'PKGDIR="{}"'.format(compat_pkgdir)
				out.einfo('Setting make.globals default {} for backward compatibility'.format(compat_setting))
				content = re.sub('^PKGDIR=.*$', compat_setting, content, flags=re.MULTILINE)
		with open(config_path, 'wt') as f:
			f.write(content)

	if do_main_repo:
		config_path = os.path.join(os.environ['ED'], GLOBAL_CONFIG_PATH.lstrip(os.sep), 'repos.conf')
		with open(config_path) as f:
			content = f.read()
			compat_setting = 'location = {}'.format(compat_main_repo)
			out.einfo('Setting repos.conf default {} for backward compatibility'.format(compat_setting))
			content = re.sub('^location =.*$', compat_setting, content, flags=re.MULTILINE)
		with open(config_path, 'wt') as f:
			f.write(content)


if __name__ == '__main__':
	main()