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
|
# Copyright 2016 Lars Wirzenius
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# =*= License: GPL-3+ =*=
import os
import icklib
class SetupAPTRepository(icklib.BuildStep):
def build(self):
if not self.run_state.changes_files:
return
self.run_state.progress['step'] = 'Prepare APT repository'
self.run_state.logger.important('Prepare APT repository')
repopath = self.statedir.get_apt_directory()
confpath = os.path.join(repopath, 'conf')
if not os.path.exists(confpath):
os.makedirs(confpath)
self._refresh_file(
os.path.join(confpath, 'distributions'),
self._make_reprepro_distributions(self.targets))
self._refresh_file(
os.path.join(confpath, 'incoming'),
self._make_reprepro_incoming(self.targets))
for base in ('incoming', 'incoming.temp'):
path = os.path.join(repopath, base)
if not os.path.exists(path):
os.makedirs(path)
def _make_reprepro_distributions(self, targets):
archs = set(t.debian_arch for t in targets)
codenames = set(t.debian_codename for t in targets)
if self.project.repo_signing_key is None:
signwith = ''
else:
signwith = 'SignWith: {}\n'.format(self.project.repo_signing_key)
result = ''
for codename in codenames:
ci_stanza = (
'Codename: {codename}-ci\n'
'Suite: {codename}\n'
'Origin: ick\n'
'Description: packages built by ick for CI\n'
'Architectures: source {archlist}\n'
'Components: main\n'
'{signwith}'
'\n'
)
result += ci_stanza.format(
codename=codename,
archlist=' '.join(archs),
signwith=signwith)
release_stanza = (
'Codename: {codename}\n'
'Suite: {codename}\n'
'Origin: ick\n'
'Description: packages built by ick for release\n'
'Architectures: source {archlist}\n'
'Components: main\n'
'{signwith}'
'\n'
)
result += release_stanza.format(
codename=codename,
archlist=' '.join(archs),
signwith=signwith)
return result
def _make_reprepro_incoming(self, targets):
release_codenames = [t.debian_codename for t in targets]
ci_codenames = [x + '-ci' for x in release_codenames]
codenames = ' '.join(release_codenames + ci_codenames)
stanza = (
'Name: default\n'
'IncomingDir: incoming\n'
'TempDir: incoming.temp\n'
'Permit: unused_files\n'
'Cleanup: on_error unused_files\n'
'Allow: {codenames}\n')
return stanza.format(codenames=codenames)
def _refresh_file(self, pathname, contents):
if os.path.exists(pathname):
with open(pathname) as f:
old_contents = f.read()
else:
old_contents = None
if old_contents != contents:
with open(pathname, 'w') as f:
f.write(contents)
|