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
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
|
# vim: set sw=4 sts=4 et :
# Copyright: 2008 Gentoo Foundation
# Author(s): Nirbheek Chauhan <nirbheek.chauhan@gmail.com>
# License: GPL-2
#
# Immortal lh!
#
import os, sys, shutil
import os.path as osp
from autotua import fetch, const, sync, chroot, jobuild
class Jobs:
"""Interface to jobs on the master server that we can do"""
def __init__(self):
self.pubkey = ''
def getjobs(self):
"""
Get a list of jobs
(skeleton code atm)
"""
jobs = []
for job_data in const.job_list:
jobs.append(Job(job_data))
return jobs
class Job:
"""A Job."""
def __init__(self, job_data):
self.maint = job_data['maintainer']
self.name = job_data['name']
self.stage = self._stage_fetchable(job_data)
self.jobdir = osp.join(const.WORKDIR, self.maint, self.name)
self.jobtagerev = job_data['jobtagerev']
self.atoms = job_data['atoms']
self.jobuilds = []
self.chroot = chroot.WorkChroot(self.jobdir, self.stage.filename)
def __repr__(self):
return '<%s: %s>' % (self.name, 'Job object')
def __str__(self):
return '%s object' % self.name
def _generic_arch(self, arch):
"""
Convert specific archs to generic archs
i686 -> x86
mips4 -> mips
"""
if arch in ['alpha', 'amd64', 'ia64', 'x86']:
return arch
if arch == 'i686':
return 'x86'
elif arch == 'sparc64':
return 'sparc'
elif arch in ['hppa1.1', 'hppa2.0']:
return 'hppa'
elif arch.startswith('mips'):
return 'mips'
else:
sys.exit('Invalid arch: '+arch+'\n')
def _stage_fetchable(self, job_data):
stage = job_data['stage']
if stage.startswith('gentoo://'):
job_data['stage'] = stage[9:]
mirrors = const.GENTOO_MIRRORS
else:
# Assume it's a proper URL
return fetch.Fetchable(uri=[stage])
job_data['gen_arch'] = self._generic_arch(job_data['arch'])
filename = const.STAGE_FILENAME % job_data
uri = []
for mirror in mirrors:
mirror += "/" + const.STAGE_MIRROR_PATH % job_data
mirror += "/" + filename
uri.append(mirror)
stage = fetch.Fetchable(uri=uri)
return stage
# Get jobuild SRC_URI -> $tmpdir/jobfiles
# jobfile -(link)-> $chroot_tmpdir/jobfiles
def _setup_jobfiles(self):
job_src = []
action = 'link'
fetcher = fetch.Fetcher(const.JOBFILE_DIR)
processor = jobuild.Processor(None, self.chroot)
for jbld in self.jobuilds:
processor.jobuild = jbld
src_uri = processor.get_var('SRC_URI').split()
for i in src_uri:
job_src.append(fetch.Fetchable(uri=[i]))
src = fetcher.tarballdir+'/%s'
dest = self.chroot.chrootdir+const.CHAUTOTUA_DIR+'/jobfiles/%s'
for fetchable in job_src:
fetcher.fetch(fetchable)
src = src % fetchable.filename
dest = dest % fetchable.filename
if action == 'link':
try:
os.link(src, dest)
except OSError:
print "Chroot and Jobfiles are on different devices. Falling back to copying..."
action = 'copy'
if action == 'copy':
shutil.copyfile(src, dest)
def fetch(self):
# Job metadata stuff
## Get stage3 (if required)
print 'Fetching stage...'
fetcher = fetch.Fetcher(const.STAGE_DIR)
fetcher.fetch(self.stage)
# Sync jobtage tree
print 'Syncing jobtage tree...'
sync.Syncer().sync()
# Export from local jobtage tree
print 'Exporting jobtage tree...'
sync.Syncer(uri=const.JOBTAGE_DIR, destdir=osp.join(self.jobdir, 'jobtage'),
rev=self.jobtagerev, scheme="git-export").sync()
## Read config, get portage snapshot if required
#self._fetch_portage_snapshot()
def prepare(self):
# Chroot setup needs to be done before parsing jobuilds
# because all parsing is done inside the chroot
print 'Setup the chroot for usage...'
self.chroot.setup()
# Create jobuild objects for parsing
for atom in self.atoms:
self.jobuilds.append(jobuild.Jobuild(self.jobdir, atom))
print 'Fetch jobuild SRC_URI and hardlink/copy into chroot'
self._setup_jobfiles()
def run(self):
processor = jobuild.Processor(None, self.chroot)
for jbld in self.jobuilds:
processor.jobuild = jbld
print 'Running jobuild "%s"' % jbld.name
processor.run_phase('all')
def tidy(self):
print 'Tidying up..'
self.chroot.tidy()
def clean(self):
# Tidy up before cleaning
self.tidy()
shutil.rmtree(self.jobdir)
os.removedirs(osp.join(const.WORKDIR, self.maint))
|