summaryrefslogtreecommitdiff
path: root/icklib/step_debian_apt_setup.py
blob: f985227675d28ea1fc7fb72b98f570c57b22d0c0 (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
# 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)