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