aboutsummaryrefslogtreecommitdiff
blob: 584a5bcb2b34c0dd168bfe1be4e7c82e9f78af0c (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
#!/usr/bin/python

# Copyright 2003-2010 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2

from __future__ import print_function


import subprocess
import os
import sys

import gentoolkit.pprinter as pp
from gentoolkit.eprefix import EPREFIX

import portage


class PkgIndex(object):
	"""Handle the cleaning of the binpkg Package
	Index file

	@type output: class
	@param output: optional output class for printing
	"""

	def __init__(self, controller=None):
		self.controller = controller
		# backup command line call
		self.emaint_cmd = "%s/usr/sbin/emaint --fix binhost" % EPREFIX


	def _get_emaint_binhost(self):
		"""Obtain a reference to the binhost module class

		@sets: self.binhost to BinhostHandler class
		@rtype: boolean
		"""
                # About noqa below: I don't understand how this code can run at all.
                # TODO: verify soundness
		try:
			self.emaint_control = Modules()  # noqa
			self.binhost = self.emaint_control._get_class('binhost')
		except InvalidModuleName as er:  # noqa
			print( pp.error("Error importing emaint binhost module"), file=sys.stderr)
			print( pp.error("Original error: " + er), file=sys.stderr)
		except:
			return False
		return True


	def _load_modules(self):
		"""Import the emaint modules and report the success/fail of them
		"""
		try:
			from emaint.module import Modules  # noqa
			from emaint.main import TaskHandler  # noqa
		except ImportError as e:
			return False
		return True


	def clean_pkgs_index(self,):
		"""This will clean the binpkgs packages index file"""
		go = self._load_modules()
		if go:
			if self.get_emaint_binhost():
				self.taskmaster = TaskHandler(show_progress_bar=True)  # noqa
				tasks = [self.binhost]
				self.taskmaster.run_tasks(tasks)


	def call_emaint(self):
		"""Run the stand alone emaint script from
		a subprocess call.

		@rtype: integer
		@return: the difference in file size
		"""
		file_ = os.path.join(portage.settings['PKGDIR'], 'Packages')
		statinfo = os.stat(file_)
		size1 = statinfo.st_size
		try:
			retcode = subprocess.call(self.emaint_cmd, shell=True)
			if retcode < 0:
				print( pp.error("Child was terminated by signal" + str(-retcode)), file=sys.stderr)
		except OSError as e:
			print( pp.error("Execution failed:" + e), file=sys.stderr)
		print()
		statinfo = os.stat(file_)
		clean_size = size1 - statinfo.st_size
		self.controller(clean_size, "Packages Index", file_, "Index")
		return clean_size