8
8
'DistroSeriesDifferenceJob',
11
from storm.expr import And
12
12
from zope.component import getUtility
13
13
from zope.interface import (
18
from canonical.database.sqlbase import quote
19
from lp.services.database.lpstorm import (
18
from canonical.database.sqlbase import sqlvalues
19
from canonical.launchpad.interfaces.lpstorm import (
23
23
from lp.registry.interfaces.distroseriesdifference import (
24
24
IDistroSeriesDifferenceSource,
26
from lp.registry.interfaces.distroseriesparent import IDistroSeriesParentSet
26
27
from lp.registry.interfaces.pocket import PackagePublishingPocket
27
28
from lp.registry.model.distroseries import DistroSeries
28
29
from lp.registry.model.distroseriesdifference import DistroSeriesDifference
47
48
FEATURE_FLAG_ENABLE_MODULE = u"soyuz.derived_series_jobs.enabled"
50
def make_metadata(sourcepackagename_id, parent_series_id):
51
"""Return JSON metadata for a job on `sourcepackagename_id`."""
51
def make_metadata(sourcepackagename, parent_series):
52
"""Return JSON metadata for a job on `sourcepackagename`."""
53
'sourcepackagename': sourcepackagename_id,
54
'parent_series': parent_series_id,
54
'sourcepackagename': sourcepackagename.id,
55
'parent_series': parent_series.id,
69
70
job = DistributionJob(
70
71
distribution=derived_series.distribution, distroseries=derived_series,
71
72
job_type=DistributionJobType.DISTROSERIESDIFFERENCE,
72
metadata=make_metadata(sourcepackagename.id, parent_series.id))
73
metadata=make_metadata(sourcepackagename, parent_series))
73
74
IMasterStore(DistributionJob).add(job)
74
75
return DistroSeriesDifferenceJob(job)
77
def compose_job_insertion_tuple(derived_series, parent_series,
78
sourcepackagename_id, job_id):
79
"""Compose tuple for insertion into `DistributionJob`.
81
:param derived_series: Derived `DistroSeries`.
82
:param parent_series: Parent `DistroSeries`.
83
:param sourcepackagename_id: ID of `SourcePackageName`.
84
:param job_id: associated `Job` id.
85
:return: A tuple of: derived distribution id, derived distroseries id,
86
job type, job id, JSON data map.
88
json = simplejson.dumps(
89
make_metadata(sourcepackagename_id, parent_series.id))
91
derived_series.distribution.id,
93
DistributionJobType.DISTROSERIESDIFFERENCE,
99
78
def create_multiple_jobs(derived_series, parent_series):
100
"""Create `DistroSeriesDifferenceJob`s between parent and derived series.
79
"""Create a `DistroSeriesDifferenceJob` for all the source packages in
102
82
:param derived_series: A `DistroSeries` that is assumed to be derived
104
84
:param parent_series: A `DistroSeries` that is a parent of
106
:return: A list of newly-created `DistributionJob` ids.
108
87
store = IStore(SourcePackageRelease)
109
88
source_package_releases = store.find(
110
89
SourcePackageRelease,
111
SourcePackagePublishingHistory.sourcepackagerelease ==
112
SourcePackageRelease.id,
113
SourcePackagePublishingHistory.distroseries == derived_series.id,
114
SourcePackagePublishingHistory.status.is_in(active_publishing_status))
91
SourcePackagePublishingHistory.sourcepackagerelease ==
92
SourcePackageRelease.id,
93
SourcePackagePublishingHistory.distroseries == derived_series.id,
94
SourcePackagePublishingHistory.status.is_in(
95
active_publishing_status)))
115
96
nb_jobs = source_package_releases.count()
120
97
sourcepackagenames = source_package_releases.values(
121
98
SourcePackageRelease.sourcepackagenameID)
122
99
job_ids = Job.createMultiple(store, nb_jobs)
125
quote(compose_job_insertion_tuple(
126
derived_series, parent_series, sourcepackagename, job_id))
127
for job_id, sourcepackagename in zip(job_ids, sourcepackagenames)]
101
def composeJobInsertionTuple(derived_series, parent_series,
102
sourcepackagename, job_id):
104
derived_series.distribution.id, derived_series.id,
105
DistributionJobType.DISTROSERIESDIFFERENCE, job_id,
106
DistributionJob.serializeMetadata(
107
{'sourcepackagename': sourcepackagename,
108
'parent_series': parent_series.id}))
109
format_string = "(%s)" % ", ".join(["%s"] * len(data))
110
return format_string % sqlvalues(*data)
113
composeJobInsertionTuple(
114
derived_series, parent_series, sourcepackagename, job_id)
115
for job_id, sourcepackagename in
116
zip(job_ids, sourcepackagenames)]
129
118
store = IStore(DistributionJob)
130
119
result = store.execute("""
171
161
runner some unnecessary work, but we don't expect a bit of
172
162
unnecessary work to be a big problem.
174
if parent_series.distribution == derived_series.distribution:
175
# Differences within a distribution are not tracked.
164
if derived_series is None:
166
dsp = getUtility(IDistroSeriesParentSet).getByDerivedSeries(
171
if parent.parent_series.distribution == derived_series.distribution:
172
# Differences within a distribution are not tracked.
177
174
existing_jobs = find_waiting_jobs(
178
175
derived_series, sourcepackagename, parent_series)
179
176
return len(existing_jobs) == 0
199
196
"""See `IDistroSeriesDifferenceJobSource`."""
200
197
if not getFeatureFlag(FEATURE_FLAG_ENABLE_MODULE):
203
199
# -backports and -proposed are not really part of a standard
204
200
# distribution's packages so we're ignoring them here. They can
205
201
# always be manually synced by the users if necessary, in the
206
202
# rare occasions that they require them.
208
204
PackagePublishingPocket.BACKPORTS,
209
PackagePublishingPocket.PROPOSED,
211
if pocket in ignored_pockets:
205
PackagePublishingPocket.PROPOSED):
214
# Create jobs for DSDs between the derived_series' parents and
215
# the derived_series itself.
216
parent_series_jobs = [
217
create_job(derived_series, sourcepackagename, parent)
218
for parent in derived_series.getParentSeries()
219
if may_require_job(derived_series, sourcepackagename, parent)]
208
parent_series = derived_series.getParentSeries()
209
# Create jobs for DSDs between the derived_series and its
211
for parent in parent_series:
213
derived_series, sourcepackagename, parent):
214
jobs.append(create_job(
215
derived_series, sourcepackagename, parent))
221
216
# Create jobs for DSDs between the derived_series and its
223
derived_series_jobs = [
224
create_job(child, sourcepackagename, derived_series)
225
for child in derived_series.getDerivedSeries()
226
if may_require_job(child, sourcepackagename, derived_series)]
228
return parent_series_jobs + derived_series_jobs
231
def createForSPPHs(cls, spphs):
232
"""See `IDistroSeriesDifferenceJobSource`."""
233
# XXX JeroenVermeulen 2011-08-25, bug=834499: This won't do for
234
# some of the mass deletions we're planning to support.
237
if spph.archive.is_main:
238
cls.createForPackagePublication(
240
spph.sourcepackagerelease.sourcepackagename, spph.pocket)
218
for child in derived_series.getDerivedSeries():
220
child, sourcepackagename, derived_series):
221
jobs.append(create_job(
222
child, sourcepackagename, derived_series))
243
226
def massCreateForSeries(cls, derived_series):