# 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 . # # =*= 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)