~launchpad-pqm/launchpad/devel

« back to all changes in this revision

Viewing changes to lib/lp/soyuz/scripts/processaccepted.py

[r=gmb][bug=833736] When syncing packages to a distribution,
        make sure any bugs referenced in the package's changelog are closed.

Show diffs side-by-side

added added

removed removed

Lines of Context:
37
37
from lp.soyuz.enums import (
38
38
    ArchivePurpose,
39
39
    PackageUploadStatus,
 
40
    re_bug_numbers,
 
41
    re_closes,
 
42
    re_lp_closes,
40
43
    )
41
44
from lp.soyuz.interfaces.archive import IArchiveSet
42
45
from lp.soyuz.interfaces.queue import IPackageUploadSet
64
67
    return bugs
65
68
 
66
69
 
 
70
def get_bugs_from_changelog_entry(sourcepackagerelease, since_version):
 
71
    """Parse the changelog_entry in the sourcepackagerelease and return a
 
72
    list of `IBug`s referenced by it.
 
73
    """
 
74
    changelog = sourcepackagerelease.aggregate_changelog(since_version)
 
75
    closes = []
 
76
    # There are 2 main regexes to match.  Each match from those can then
 
77
    # have further multiple matches from the 3rd regex:
 
78
    # closes: NNN, NNN
 
79
    # lp: #NNN, #NNN
 
80
    regexes = (
 
81
        re_closes.finditer(changelog), re_lp_closes.finditer(changelog))
 
82
    for regex in regexes:
 
83
        for match in regex:
 
84
            bug_match = re_bug_numbers.findall(match.group(0))
 
85
            closes += map(int, bug_match)
 
86
 
 
87
    bugs = []
 
88
    for bug_id in closes:
 
89
        try:
 
90
            bug = getUtility(IBugSet).get(bug_id)
 
91
        except NotFoundError:
 
92
            continue
 
93
        else:
 
94
            bugs.append(bug)
 
95
 
 
96
    return bugs
 
97
 
 
98
 
67
99
def can_close_bugs(target):
68
100
    """Whether or not bugs should be closed in the given target.
69
101
 
119
151
            source_queue_item.sourcepackagerelease, changesfile_object)
120
152
 
121
153
 
122
 
def close_bugs_for_sourcepublication(source_publication):
 
154
def close_bugs_for_sourcepublication(source_publication, since_version=None):
123
155
    """Close bugs for a given sourcepublication.
124
156
 
125
157
    Given a `ISourcePackagePublishingHistory` close bugs mentioned in
131
163
    sourcepackagerelease = source_publication.sourcepackagerelease
132
164
    changesfile_object = sourcepackagerelease.upload_changesfile
133
165
 
134
 
    # No changesfile available, cannot close bugs.
135
 
    if changesfile_object is None:
136
 
        return
137
 
 
138
166
    close_bugs_for_sourcepackagerelease(
139
 
        sourcepackagerelease, changesfile_object)
140
 
 
141
 
 
142
 
def close_bugs_for_sourcepackagerelease(source_release, changesfile_object):
 
167
        sourcepackagerelease, changesfile_object, since_version)
 
168
 
 
169
 
 
170
def close_bugs_for_sourcepackagerelease(source_release, changesfile_object,
 
171
                                        since_version=None):
143
172
    """Close bugs for a given source.
144
173
 
145
174
    Given a `ISourcePackageRelease` and a corresponding changesfile object,
146
175
    close bugs mentioned in the changesfile in the context of the source.
 
176
 
 
177
    If changesfile_object is None and since_version is supplied,
 
178
    close all the bugs in changelog entries made after that version and up
 
179
    to and including the source_release's version.  It does this by parsing
 
180
    the changelog on the sourcepackagerelease.  This could be extended in
 
181
    the future to deal with the changes file as well but there is no
 
182
    requirement to do so right now.
147
183
    """
148
 
    bugs_to_close = get_bugs_from_changes_file(changesfile_object)
 
184
    if since_version and source_release.changelog:
 
185
        bugs_to_close = get_bugs_from_changelog_entry(
 
186
            source_release, since_version=since_version)
 
187
    elif changesfile_object:
 
188
        bugs_to_close = get_bugs_from_changes_file(changesfile_object)
 
189
    else:
 
190
        return
149
191
 
150
192
    # No bugs to be closed by this upload, move on.
151
193
    if not bugs_to_close: