aboutsummaryrefslogtreecommitdiff
blob: 878b573533f98c979e5ac137e80e0214f4e8c3f3 (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
# vim: set sw=4 sts=4 et :
# Copyright: 2008 Gentoo Foundation
# Author(s): Nirbheek Chauhan <nirbheek.chauhan@gmail.com>
# License: GPL-2
#
# Immortal lh!
#

# XXX: This is purely yay-something-works code
# This will change radically with time

import re, subprocess, sys, os
import os.path as osp
from .. import const, daemon

class Jobuild(object):
    """A jobuild"""

    def __init__(self, jobdir, atom):
        """
        @param jobdir: Job directory (of the form tmpdir/maint/job_name)
        @type jobdir: string

        @param atom: Atom for finding the corresponding jobuild
        @type jobdir: string
        """
        self.name = atom
        self.jobdir = jobdir
        self.path = self._best_jobuild(atom)

    def __str__(self):
        return '%s jobuild object' % self.name

    def _split_atom(self, atom):
        regex = re.compile(r'^([<>]?=)?([a-zA-Z0-9_+-]+)/([a-zA-Z0-9_+-]+)(-|$)([0-9]+\.[0-9]+)?') # Fancy regex aye?
        #                       >=       bheekling       /    test-beagle   -    1.0
        #                                bheekling       /    build-brasero
        parts = regex.findall(atom)
        if not parts:
            # FIXME: Custom exceptions
            raise 'Invalid atom %s' % atom
        parts = parts[0]
        if parts[3] and not parts[4]:
            # FIXME: Custom exceptions
            raise 'Invalid atom %s' % atom
        parts = (parts[0], parts[1], parts[2], parts[4],)
        if (parts[0] and not parts[3]) or (parts[3] and not parts[0]):
            # FIXME: Custom exceptions
            raise 'Invalid atom %s' % atom
        return parts

    def _get_all_pv_sorted(self, data):
        files = os.listdir('%(jobtage)s/%(maint)s/%(pn)s' % data)
        for file in files[:]:
            if not file.endswith('.jobuild'):
                files.remove(file)
            else:
                files[files.index(file)] = '=%s/%s' % (data['maint'], osp.basename(file)[:-8],) # .jobuild is 8 characters
                #                           =maint/pn-pv
        pv = []
        for atom in files:
            pv.append(self._split_atom(atom)[3])
        pv.sort()
        return pv

    def _best_jobuild(self, atom):
        parts = self._split_atom(atom)
        data = {'op': parts[0],
                'maint': parts[1],
                'pn': parts[2],
                'pv': parts[3],
                'jobtage': '%s/jobtage' % self.jobdir}
        if data['op'] == '=':
            pass # Nothing to be done
        elif not data['op']:
            pv = self._get_all_pv_sorted(data)
            data['pv'] = pv[-1]
        elif data['op'] == '>=':
            pv = self._get_all_pv_sorted(data)
            if pv[-1] >= data['pv']:
                data['pv'] = pv[-1]
            else:
                raise 'No matching jobuild found for atom \"%s\"' % atom
        elif data['op'] == '<=':
            pv = self._get_all_pv_sorted(data)
            pv.reverse()
            for i in pv:
                if i <= data['pv']:
                    data['pv'] = i
                    break
                if i == pv[-1]: # If it's the last pv..
                    raise 'No matching jobuild found for atom \"%s\"' % atom
        return '%(jobtage)s/%(maint)s/%(pn)s/%(pn)s-%(pv)s.jobuild' % data

class Processor(object):
    """Jobuild processor"""

    def __init__(self, jobuild, chroot):
        """
        @param jobuild: Jobuild to process
        @type jobuild: L{autotua.jobuild.Jobuild}

        @param chroot: Chroot to use for processing the jobuild
        @type chroot: L{autotua.chroot.WorkChroot}
        """
        self.jobuild = jobuild
        self.chroot = chroot

    def run_phase(self, phase):
        """Run the specified phase of the jobuild"""
        args = {'phase': phase,
                'jobuild': self.jobuild.path,
                'chroot': self.chroot.dir,}
        self._msg('RUN_PHASE "%(phase)s" "%(jobuild)s" "%(chroot)s"' % args)

    def get_var(self, var):
        """
        Parse jobuild and get a variable
        (yay-something-works function)
        """
        args = {'var': var,
                'jobuild': self.jobuild.path,}
        return self._msg('GET_VAR "%(var)s" "%(jobuild)s"' % args)

    def _msg(self, msg):
        proc = daemon.Spawn('\"%s\"/bin/jobuild.sh %s' % (const.AUTOTUA_DIR, msg))
        response = proc.process.stderr.read()[:-1] # Remove trailing newline
        return response