# 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 re import subprocess import sys import urllib import urlparse import cliapp import icklib class UploadDebianPackagesToCIRepo(icklib.BuildStep): def build(self): if not self.run_state.changes_files: return self.run_state.progress['step'] = ( 'Upload built packages to APT repository') self.run_state.logger.important( 'Upload built packages to APT repository') with self.run_state.logger: repopath = self.statedir.get_apt_directory() incoming = os.path.join(repopath, 'incoming') line_logger = icklib.LineLogger( self.run_state.progress, self.run_state.logger) for changes_url in self.run_state.changes_files: self.run_state.logger.important( 'changes_url: %r' % changes_url) # dget doesn't URL-decode file:// URLs. So we do that. changes_url = urllib.unquote(changes_url) self._fixup_dbgsym(changes_url) self._fixup_buildinfo(changes_url) cliapp.runcmd( ['dget', '-du', changes_url], cwd=incoming, stderr=subprocess.STDOUT, stdout_callback=line_logger.log_lines) exit_code, stdout, stderr = cliapp.runcmd_unchecked( ['reprepro', 'processincoming', 'default'], cwd=repopath) line_logger.log_lines(stdout) line_logger.log_lines(stderr) if exit_code != 0: pattern = r"Name '.*-dbgsym' of binary '.*' is not listed" if re.search(pattern, stderr): self.run_state.logger.chatty( 'Ignoring reprepro problem wrt -dbgsym') cliapp.runcmd( ['reprepro', 'export'], cwd=repopath, stdout_callback=line_logger.log_lines, stderr=subprocess.STDOUT) else: sys.exit(exit_code) def _fixup_dbgsym(self, changes_url): scheme, _, path, _, _, _ = urlparse.urlparse( changes_url) assert scheme == 'file' with open(path) as f: text = f.read() fixed = ''.join( '{}\n'.format(line) for line in text.splitlines() if '-dbgsym' not in line) with open(path, 'w') as f: f.write(fixed) def _fixup_buildinfo(self, changes_url): scheme, _, path, _, _, _ = urlparse.urlparse( changes_url) assert scheme == 'file' with open(path) as f: text = f.read() fixed = ''.join( '{}\n'.format(line) for line in text.splitlines() if '.buildinfo' not in line) with open(path, 'w') as f: f.write(fixed)