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

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

import subprocess
import os
import sys

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

import portage


class PkgIndex:
    """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:
            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