~launchpad-pqm/launchpad/devel

« back to all changes in this revision

Viewing changes to lib/lp/soyuz/doc/distroseriesqueue-translations.txt

  • Committer: Launchpad Patch Queue Manager
  • Date: 2011-06-16 12:17:34 UTC
  • mfrom: (13233.1.2 pre-394645)
  • Revision ID: launchpad@pqm.canonical.com-20110616121734-igzzpd482yots7d3
[r=jtv][bug=394645,537335][no-qa] Lint blows but hoover sucks.

Show diffs side-by-side

added added

removed removed

Lines of Context:
4
4
This test covers the use case when a package includes translations and is
5
5
uploaded into the system.
6
6
 
7
 
  >>> from lp.registry.model.gpgkey import GPGKey
8
 
  >>> from lp.soyuz.model.component import Component
9
 
  >>> from lp.soyuz.model.processor import ProcessorFamily
10
 
  >>> from lp.soyuz.model.section import Section
11
 
  >>> from lp.soyuz.model.publishing import (
12
 
  ...     SourcePackagePublishingHistory)
13
 
  >>> from lp.registry.interfaces.distribution import IDistributionSet
14
 
  >>> from lp.registry.interfaces.distroseries import IDistroSeriesSet
15
 
  >>> from lp.registry.interfaces.pocket import PackagePublishingPocket
16
 
  >>> from lp.soyuz.interfaces.component import IComponentSet
17
 
  >>> from lp.soyuz.enums import (
18
 
  ...     PackagePublishingStatus)
19
 
  >>> from lp.registry.interfaces.sourcepackagename import (
20
 
  ...     ISourcePackageNameSet)
21
 
 
22
 
  >>> from lp.archiveuploader.nascentupload import NascentUpload
23
 
  >>> from lp.archiveuploader.tests import datadir, getPolicy
24
 
 
25
 
  >>> from canonical.launchpad.ftests import import_public_test_keys
26
 
  >>> import_public_test_keys()
27
 
 
28
 
  >>> from canonical.database.constants import UTC_NOW
29
 
  >>> from lp.registry.interfaces.sourcepackage import SourcePackageUrgency
30
 
 
31
 
  # Login as an admin.
32
 
  >>> login('foo.bar@canonical.com')
33
 
 
34
 
  # We need to setup our test environment and create the needed objects.
35
 
  >>> distro_series_set = getUtility(IDistroSeriesSet)
36
 
  >>> ubuntu = getUtility(IDistributionSet)['ubuntu']
37
 
  >>> hoary = distro_series_set.queryByName(ubuntu, 'hoary')
38
 
 
39
 
  # Create the Dapper distro series.
40
 
  >>> dapper = ubuntu.newSeries(
41
 
  ...     'dapper', 'Dapper', 'Dapper',
42
 
  ...     'Dapper', 'Dapper', '06.04', hoary, hoary.owner)
43
 
 
44
 
  # And an AMD 64 arch series.
45
 
  >>> dapper_amd64 = dapper.newArch('amd64', ProcessorFamily.get(3), True,
46
 
  ...     dapper.owner)
 
7
    >>> from lp.registry.model.gpgkey import GPGKey
 
8
    >>> from lp.soyuz.model.component import Component
 
9
    >>> from lp.soyuz.model.processor import ProcessorFamily
 
10
    >>> from lp.soyuz.model.section import Section
 
11
    >>> from lp.soyuz.model.publishing import (
 
12
    ...     SourcePackagePublishingHistory)
 
13
    >>> from lp.registry.interfaces.distribution import IDistributionSet
 
14
    >>> from lp.registry.interfaces.distroseries import IDistroSeriesSet
 
15
    >>> from lp.registry.interfaces.pocket import PackagePublishingPocket
 
16
    >>> from lp.soyuz.interfaces.component import IComponentSet
 
17
    >>> from lp.soyuz.enums import (
 
18
    ...     PackagePublishingStatus)
 
19
    >>> from lp.registry.interfaces.sourcepackagename import (
 
20
    ...     ISourcePackageNameSet)
 
21
 
 
22
    >>> from lp.archiveuploader.nascentupload import NascentUpload
 
23
    >>> from lp.archiveuploader.tests import datadir, getPolicy
 
24
 
 
25
    >>> from canonical.launchpad.ftests import import_public_test_keys
 
26
    >>> import_public_test_keys()
 
27
 
 
28
    >>> from canonical.database.constants import UTC_NOW
 
29
    >>> from lp.registry.interfaces.sourcepackage import SourcePackageUrgency
 
30
 
 
31
# Login as an admin.
 
32
    >>> login('foo.bar@canonical.com')
 
33
 
 
34
    # We need to setup our test environment and create the needed objects.
 
35
    >>> distro_series_set = getUtility(IDistroSeriesSet)
 
36
    >>> ubuntu = getUtility(IDistributionSet)['ubuntu']
 
37
    >>> hoary = distro_series_set.queryByName(ubuntu, 'hoary')
 
38
 
 
39
# Create the Dapper distro series.
 
40
    >>> dapper = ubuntu.newSeries(
 
41
    ...     'dapper', 'Dapper', 'Dapper',
 
42
    ...     'Dapper', 'Dapper', '06.04', hoary, hoary.owner)
 
43
 
 
44
# And an AMD 64 arch series.
 
45
    >>> dapper_amd64 = dapper.newArch('amd64', ProcessorFamily.get(3), True,
 
46
    ...     dapper.owner)
47
47
 
48
48
Only uploads to the RELEASE, UPDATES, SECURITY and PROPOSED pockets are
49
49
considered for import. An upload to the BACKPORT pocket won't appear in the
50
50
queue:
51
51
 
52
 
  # We are going to import the pmount build into RELEASE pocket.
53
 
  >>> pmount_sourcepackagename = getUtility(ISourcePackageNameSet)['pmount']
54
 
  >>> source_package_release = dapper.createUploadedSourcePackageRelease(
55
 
  ...     pmount_sourcepackagename, "0.9.7-2ubuntu2", dapper.owner,
56
 
  ...     None, None, 'i386', Component.get(1), dapper.owner,
57
 
  ...     SourcePackageUrgency.LOW, None, None, None, GPGKey.get(1),
58
 
  ...     Section.get(1), '', '', '', '', dapper.main_archive,
59
 
  ...     'copyright ?!', '', '')
60
 
 
61
 
  >>> publishing_history = SourcePackagePublishingHistory(
62
 
  ...     distroseries=dapper.id,
63
 
  ...     sourcepackagerelease=source_package_release.id,
64
 
  ...     component=source_package_release.component.id,
65
 
  ...     section=source_package_release.section.id,
66
 
  ...     status=PackagePublishingStatus.PUBLISHED,
67
 
  ...     datecreated=UTC_NOW,
68
 
  ...     pocket=PackagePublishingPocket.RELEASE,
69
 
  ...     archive=dapper.main_archive)
70
 
 
71
 
  # Do the upload into the system.
72
 
 
73
 
  >>> build = source_package_release.createBuild(
74
 
  ...      dapper_amd64, PackagePublishingPocket.RELEASE, dapper.main_archive)
75
 
 
76
 
  >>> buildd_policy = getPolicy(
77
 
  ...     name='buildd', distro='ubuntu', distroseries='dapper')
78
 
 
79
 
  >>> from lp.services.log.logger import FakeLogger
80
 
  >>> pmount_upload = NascentUpload.from_changesfile_path(
81
 
  ...     datadir('pmount_0.9.7-2ubuntu2_amd64.changes'),
82
 
  ...     buildd_policy, FakeLogger())
83
 
  DEBUG pmount_0.9.7-2ubuntu2_amd64.changes can be unsigned.
84
 
 
85
 
  >>> pmount_upload.process(build=build)
86
 
  DEBUG Beginning processing.
87
 
  DEBUG Verifying the changes file.
88
 
  DEBUG Verifying files in upload.
89
 
  DEBUG Verifying binary pmount_0.9.7-2ubuntu2_amd64.deb
90
 
  DEBUG Verifying timestamps in pmount_0.9.7-2ubuntu2_amd64.deb
91
 
  DEBUG Finding and applying overrides.
92
 
  DEBUG Checking for pmount/0.9.7-2ubuntu2/amd64 binary ancestry
93
 
  DEBUG pmount: (binary) NEW
94
 
  DEBUG Finished checking upload.
95
 
 
96
 
  # It was not rejected.
97
 
  >>> pmount_upload.is_rejected
98
 
  False
 
52
# We are going to import the pmount build into RELEASE pocket.
 
53
    >>> pmount_sourcepackagename = getUtility(ISourcePackageNameSet)['pmount']
 
54
    >>> source_package_release = dapper.createUploadedSourcePackageRelease(
 
55
    ...     pmount_sourcepackagename, "0.9.7-2ubuntu2", dapper.owner,
 
56
    ...     None, None, 'i386', Component.get(1), dapper.owner,
 
57
    ...     SourcePackageUrgency.LOW, None, None, None, GPGKey.get(1),
 
58
    ...     Section.get(1), '', '', '', '', dapper.main_archive,
 
59
    ...     'copyright ?!', '', '')
 
60
 
 
61
    >>> publishing_history = SourcePackagePublishingHistory(
 
62
    ...     distroseries=dapper.id,
 
63
    ...     sourcepackagerelease=source_package_release.id,
 
64
    ...     component=source_package_release.component.id,
 
65
    ...     section=source_package_release.section.id,
 
66
    ...     status=PackagePublishingStatus.PUBLISHED,
 
67
    ...     datecreated=UTC_NOW,
 
68
    ...     pocket=PackagePublishingPocket.RELEASE,
 
69
    ...     archive=dapper.main_archive)
 
70
 
 
71
# Do the upload into the system.
 
72
 
 
73
    >>> build = source_package_release.createBuild(
 
74
    ...      dapper_amd64, PackagePublishingPocket.RELEASE,
 
75
    ...      dapper.main_archive)
 
76
 
 
77
    >>> buildd_policy = getPolicy(
 
78
    ...     name='buildd', distro='ubuntu', distroseries='dapper')
 
79
 
 
80
    >>> from lp.services.log.logger import FakeLogger
 
81
    >>> pmount_upload = NascentUpload.from_changesfile_path(
 
82
    ...     datadir('pmount_0.9.7-2ubuntu2_amd64.changes'),
 
83
    ...     buildd_policy, FakeLogger())
 
84
    DEBUG pmount_0.9.7-2ubuntu2_amd64.changes can be unsigned.
 
85
 
 
86
    >>> pmount_upload.process(build=build)
 
87
    DEBUG Beginning processing.
 
88
    DEBUG Verifying the changes file.
 
89
    DEBUG Verifying files in upload.
 
90
    DEBUG Verifying binary pmount_0.9.7-2ubuntu2_amd64.deb
 
91
    DEBUG Verifying timestamps in pmount_0.9.7-2ubuntu2_amd64.deb
 
92
    DEBUG Finding and applying overrides.
 
93
    DEBUG Checking for pmount/0.9.7-2ubuntu2/amd64 binary ancestry
 
94
    DEBUG pmount: (binary) NEW
 
95
    DEBUG Finished checking upload.
 
96
 
 
97
 # It was not rejected.
 
98
    >>> pmount_upload.is_rejected
 
99
    False
99
100
 
100
101
At this point, no translations uploads have been registered for this
101
102
package.
102
103
 
103
 
  >>> from lp.registry.model.sourcepackage import SourcePackage
104
 
  >>> dapper_pmount = SourcePackage(pmount_sourcepackagename, dapper)
105
 
  >>> print len(dapper_pmount.getLatestTranslationsUploads())
106
 
  0
107
 
 
108
 
  >>> success = pmount_upload.do_accept(build=build)
109
 
  DEBUG Creating queue entry
110
 
  ...
111
 
 
112
 
  # And all things worked.
113
 
  >>> success
114
 
  True
115
 
 
116
 
  # Ensure 'deb' is NEW and 'translation' is recognized, i.e., ACCEPTED
117
 
  # XXX julian 2007-05-27 Commented out for now because getNotificationSummary
118
 
  # no longer exists and this content is impossible to check at the moment
119
 
  # since no email is generated because the recipients are not LP Persons.
120
 
  # (So why is it being checked in the first place?)
121
 
  #>>> print pmount_upload.getNotificationSummary()
122
 
  #NEW: pmount_0.9.7-2ubuntu2_amd64.deb
123
 
  #OK: pmount_0.9.7-2ubuntu2_amd64_translations.tar.gz
 
104
    >>> from lp.registry.model.sourcepackage import SourcePackage
 
105
    >>> dapper_pmount = SourcePackage(pmount_sourcepackagename, dapper)
 
106
    >>> print len(dapper_pmount.getLatestTranslationsUploads())
 
107
    0
 
108
 
 
109
    >>> success = pmount_upload.do_accept(build=build)
 
110
    DEBUG Creating queue entry
 
111
    ...
 
112
 
 
113
    # And all things worked.
 
114
    >>> success
 
115
    True
 
116
 
 
117
# Ensure 'deb' is NEW and 'translation' is recognized, i.e., ACCEPTED
 
118
# XXX julian 2007-05-27 Commented out for now because getNotificationSummary
 
119
# no longer exists and this content is impossible to check at the moment
 
120
# since no email is generated because the recipients are not LP Persons.
 
121
# (So why is it being checked in the first place?)
 
122
#>>> print pmount_upload.getNotificationSummary()
 
123
#NEW: pmount_0.9.7-2ubuntu2_amd64.deb
 
124
#OK: pmount_0.9.7-2ubuntu2_amd64_translations.tar.gz
124
125
 
125
126
The upload now shows up as the latest translations upload for the
126
127
package.
127
128
 
128
 
  >>> latest_translations_uploads = list(
129
 
  ...     dapper_pmount.getLatestTranslationsUploads())
130
 
  >>> print len(latest_translations_uploads)
131
 
  1
 
129
    >>> latest_translations_uploads = list(
 
130
    ...     dapper_pmount.getLatestTranslationsUploads())
 
131
    >>> print len(latest_translations_uploads)
 
132
    1
132
133
 
133
134
We'll get back to that uploaded file later.
134
135
 
135
 
  >>> latest_translations_upload = latest_translations_uploads[0]
136
 
 
137
 
  # Check the import queue content, it should be empty.
138
 
  >>> from lp.translations.interfaces.translationimportqueue import (
139
 
  ...     ITranslationImportQueue)
140
 
  >>> translation_import_queue = getUtility(ITranslationImportQueue)
141
 
  >>> translation_import_queue.getAllEntries(target=ubuntu).count()
142
 
  0
143
 
 
144
 
  # We need to commit the transaction to be able to use the librarian files.
145
 
  >>> import transaction
146
 
  >>> transaction.commit()
 
136
    >>> latest_translations_upload = latest_translations_uploads[0]
 
137
 
 
138
# Check the import queue content, it should be empty.
 
139
    >>> from lp.translations.interfaces.translationimportqueue import (
 
140
    ...     ITranslationImportQueue)
 
141
    >>> translation_import_queue = getUtility(ITranslationImportQueue)
 
142
    >>> translation_import_queue.getAllEntries(target=ubuntu).count()
 
143
    0
 
144
 
 
145
# We need to commit the transaction to be able to use the librarian files.
 
146
    >>> import transaction
 
147
    >>> transaction.commit()
147
148
 
148
149
An upload to the RELEASE pocket will add items to the import queue:
149
150
 
150
 
  >>> from lp.soyuz.enums import PackageUploadStatus
151
 
  >>> queue_item = dapper.getQueueItems(
152
 
  ...     status=PackageUploadStatus.NEW)[0]
153
 
  >>> queue_item.customfiles[0].publish()
 
151
    >>> from lp.soyuz.enums import PackageUploadStatus
 
152
    >>> queue_item = dapper.getQueueItems(
 
153
    ...     status=PackageUploadStatus.NEW)[0]
 
154
    >>> queue_item.customfiles[0].publish()
154
155
 
155
156
As we can see from the translation import queue content.
156
157
 
157
 
  >>> for entry in translation_import_queue.getAllEntries(target=ubuntu):
158
 
  ...     print '%s/%s by %s: %s' % (
159
 
  ...         entry.distroseries.name, entry.sourcepackagename.name,
160
 
  ...         entry.importer.name, entry.path)
161
 
  dapper/pmount by ubuntu-team: po/es_ES.po
162
 
  dapper/pmount by ubuntu-team: po/ca.po
163
 
  dapper/pmount by ubuntu-team: po/de.po
164
 
  dapper/pmount by ubuntu-team: po/cs.po
165
 
  dapper/pmount by ubuntu-team: po/es.po
166
 
  dapper/pmount by ubuntu-team: po/fr.po
167
 
  dapper/pmount by ubuntu-team: po/hr.po
168
 
  dapper/pmount by ubuntu-team: po/nb.po
169
 
  dapper/pmount by ubuntu-team: po/pmount.pot
170
 
  dapper/pmount by ubuntu-team: po/it_IT.po
171
 
 
172
 
  # Abort the transaction so we can check the same upload in a different
173
 
  # pocket.
174
 
  >>> transaction.abort()
175
 
 
176
 
  # The import queue content should be empty now that the transaction is
177
 
  # reverted.
178
 
  >>> translation_import_queue.getAllEntries(target=ubuntu).count()
179
 
  0
 
158
    >>> for entry in translation_import_queue.getAllEntries(target=ubuntu):
 
159
    ...     print '%s/%s by %s: %s' % (
 
160
    ...         entry.distroseries.name, entry.sourcepackagename.name,
 
161
    ...         entry.importer.name, entry.path)
 
162
    dapper/pmount by ubuntu-team: po/es_ES.po
 
163
    dapper/pmount by ubuntu-team: po/ca.po
 
164
    dapper/pmount by ubuntu-team: po/de.po
 
165
    dapper/pmount by ubuntu-team: po/cs.po
 
166
    dapper/pmount by ubuntu-team: po/es.po
 
167
    dapper/pmount by ubuntu-team: po/fr.po
 
168
    dapper/pmount by ubuntu-team: po/hr.po
 
169
    dapper/pmount by ubuntu-team: po/nb.po
 
170
    dapper/pmount by ubuntu-team: po/pmount.pot
 
171
    dapper/pmount by ubuntu-team: po/it_IT.po
 
172
 
 
173
# Abort the transaction so we can check the same upload in a different
 
174
# pocket.
 
175
    >>> transaction.abort()
 
176
 
 
177
# The import queue content should be empty now that the transaction is
 
178
# reverted.
 
179
    >>> translation_import_queue.getAllEntries(target=ubuntu).count()
 
180
    0
180
181
 
181
182
An upload to the BACKPORTS pocket will not add items to the import queue:
182
183
 
183
 
  >>> ubuntu = getUtility(IDistributionSet)['ubuntu']
184
 
  >>> dapper = distro_series_set.queryByName(ubuntu, 'dapper')
185
 
  >>> queue_item = dapper.getQueueItems(status=PackageUploadStatus.NEW)[0]
186
 
  >>> queue_item.pocket = PackagePublishingPocket.BACKPORTS
187
 
  >>> queue_item.customfiles[0].publish()
188
 
 
189
 
  # And this time, we see that there are no entries imported in the queue.
190
 
  >>> translation_import_queue.getAllEntries(target=ubuntu).count()
191
 
  0
192
 
 
193
 
  # Let's abort the transaction so we can check the same upload in a different
194
 
  # pocket.
195
 
  >>> transaction.abort()
 
184
    >>> ubuntu = getUtility(IDistributionSet)['ubuntu']
 
185
    >>> dapper = distro_series_set.queryByName(ubuntu, 'dapper')
 
186
    >>> queue_item = dapper.getQueueItems(status=PackageUploadStatus.NEW)[0]
 
187
    >>> queue_item.pocket = PackagePublishingPocket.BACKPORTS
 
188
    >>> queue_item.customfiles[0].publish()
 
189
 
 
190
# And this time, we see that there are no entries imported in the queue.
 
191
    >>> translation_import_queue.getAllEntries(target=ubuntu).count()
 
192
    0
 
193
 
 
194
# Let's abort the transaction so we can check the same upload in a different
 
195
# pocket.
 
196
    >>> transaction.abort()
196
197
 
197
198
But an upload to the UPDATE pocket will add items to the import queue:
198
199
 
199
 
  >>> ubuntu = getUtility(IDistributionSet)['ubuntu']
200
 
  >>> dapper = distro_series_set.queryByName(ubuntu, 'dapper')
201
 
  >>> queue_item = dapper.getQueueItems(status=PackageUploadStatus.NEW)[0]
202
 
  >>> queue_item.pocket = PackagePublishingPocket.UPDATES
203
 
  >>> queue_item.customfiles[0].publish()
 
200
    >>> ubuntu = getUtility(IDistributionSet)['ubuntu']
 
201
    >>> dapper = distro_series_set.queryByName(ubuntu, 'dapper')
 
202
    >>> queue_item = dapper.getQueueItems(status=PackageUploadStatus.NEW)[0]
 
203
    >>> queue_item.pocket = PackagePublishingPocket.UPDATES
 
204
    >>> queue_item.customfiles[0].publish()
204
205
 
205
206
As we can see from the translation import queue content.
206
207
 
207
 
  >>> for entry in translation_import_queue.getAllEntries(target=ubuntu):
208
 
  ...     print '%s/%s by %s: %s' % (
209
 
  ...         entry.distroseries.name, entry.sourcepackagename.name,
210
 
  ...         entry.importer.name, entry.path)
211
 
  dapper/pmount by ubuntu-team: po/es_ES.po
212
 
  dapper/pmount by ubuntu-team: po/ca.po
213
 
  dapper/pmount by ubuntu-team: po/de.po
214
 
  dapper/pmount by ubuntu-team: po/cs.po
215
 
  dapper/pmount by ubuntu-team: po/es.po
216
 
  dapper/pmount by ubuntu-team: po/fr.po
217
 
  dapper/pmount by ubuntu-team: po/hr.po
218
 
  dapper/pmount by ubuntu-team: po/nb.po
219
 
  dapper/pmount by ubuntu-team: po/pmount.pot
220
 
  dapper/pmount by ubuntu-team: po/it_IT.po
 
208
    >>> for entry in translation_import_queue.getAllEntries(target=ubuntu):
 
209
    ...     print '%s/%s by %s: %s' % (
 
210
    ...         entry.distroseries.name, entry.sourcepackagename.name,
 
211
    ...         entry.importer.name, entry.path)
 
212
    dapper/pmount by ubuntu-team: po/es_ES.po
 
213
    dapper/pmount by ubuntu-team: po/ca.po
 
214
    dapper/pmount by ubuntu-team: po/de.po
 
215
    dapper/pmount by ubuntu-team: po/cs.po
 
216
    dapper/pmount by ubuntu-team: po/es.po
 
217
    dapper/pmount by ubuntu-team: po/fr.po
 
218
    dapper/pmount by ubuntu-team: po/hr.po
 
219
    dapper/pmount by ubuntu-team: po/nb.po
 
220
    dapper/pmount by ubuntu-team: po/pmount.pot
 
221
    dapper/pmount by ubuntu-team: po/it_IT.po
221
222
 
222
 
  # Let's abort the transaction so we can check the same upload in a different
223
 
  # pocket.
224
 
  >>> transaction.abort()
 
223
# Let's abort the transaction so we can check the same upload in a different
 
224
# pocket.
 
225
    >>> transaction.abort()
225
226
 
226
227
Uploads to restricted component are accepted too.
227
228
 
228
 
  >>> ubuntu = getUtility(IDistributionSet)['ubuntu']
229
 
  >>> dapper = distro_series_set.queryByName(ubuntu, 'dapper')
230
 
  >>> restricted_component = getUtility(IComponentSet)['restricted']
231
 
  >>> queue_item = dapper.getQueueItems(status=PackageUploadStatus.NEW)[0]
 
229
    >>> ubuntu = getUtility(IDistributionSet)['ubuntu']
 
230
    >>> dapper = distro_series_set.queryByName(ubuntu, 'dapper')
 
231
    >>> restricted_component = getUtility(IComponentSet)['restricted']
 
232
    >>> queue_item = dapper.getQueueItems(status=PackageUploadStatus.NEW)[0]
232
233
 
233
 
  # Change the component where this package was attached.
234
 
  >>> queue_item.builds[0].build.source_package_release.override(
235
 
  ...     component=restricted_component)
236
 
  >>> queue_item.customfiles[0].publish()
 
234
# Change the component where this package was attached.
 
235
    >>> queue_item.builds[0].build.source_package_release.override(
 
236
    ...     component=restricted_component)
 
237
    >>> queue_item.customfiles[0].publish()
237
238
 
238
239
As we can see from the translation import queue content.
239
240
 
240
 
  >>> for entry in translation_import_queue.getAllEntries(target=ubuntu):
241
 
  ...     print '%s/%s by %s: %s' % (
242
 
  ...         entry.distroseries.name, entry.sourcepackagename.name,
243
 
  ...         entry.importer.name, entry.path)
244
 
  dapper/pmount by ubuntu-team: po/es_ES.po
245
 
  dapper/pmount by ubuntu-team: po/ca.po
246
 
  dapper/pmount by ubuntu-team: po/de.po
247
 
  dapper/pmount by ubuntu-team: po/cs.po
248
 
  dapper/pmount by ubuntu-team: po/es.po
249
 
  dapper/pmount by ubuntu-team: po/fr.po
250
 
  dapper/pmount by ubuntu-team: po/hr.po
251
 
  dapper/pmount by ubuntu-team: po/nb.po
252
 
  dapper/pmount by ubuntu-team: po/pmount.pot
253
 
  dapper/pmount by ubuntu-team: po/it_IT.po
 
241
    >>> for entry in translation_import_queue.getAllEntries(target=ubuntu):
 
242
    ...     print '%s/%s by %s: %s' % (
 
243
    ...         entry.distroseries.name, entry.sourcepackagename.name,
 
244
    ...         entry.importer.name, entry.path)
 
245
    dapper/pmount by ubuntu-team: po/es_ES.po
 
246
    dapper/pmount by ubuntu-team: po/ca.po
 
247
    dapper/pmount by ubuntu-team: po/de.po
 
248
    dapper/pmount by ubuntu-team: po/cs.po
 
249
    dapper/pmount by ubuntu-team: po/es.po
 
250
    dapper/pmount by ubuntu-team: po/fr.po
 
251
    dapper/pmount by ubuntu-team: po/hr.po
 
252
    dapper/pmount by ubuntu-team: po/nb.po
 
253
    dapper/pmount by ubuntu-team: po/pmount.pot
 
254
    dapper/pmount by ubuntu-team: po/it_IT.po
254
255
 
255
 
  # Let's abort the transaction so we can check the same upload in a different
256
 
  # component.
257
 
  >>> transaction.abort()
 
256
# Let's abort the transaction so we can check the same upload in a different
 
257
# component.
 
258
    >>> transaction.abort()
258
259
 
259
260
But the ones into universe are not accepted.
260
261
 
261
 
  >>> ubuntu = getUtility(IDistributionSet)['ubuntu']
262
 
  >>> dapper = distro_series_set.queryByName(ubuntu, 'dapper')
263
 
  >>> universe_component = getUtility(IComponentSet)['universe']
264
 
  >>> queue_item = dapper.getQueueItems(status=PackageUploadStatus.NEW)[0]
 
262
    >>> ubuntu = getUtility(IDistributionSet)['ubuntu']
 
263
    >>> dapper = distro_series_set.queryByName(ubuntu, 'dapper')
 
264
    >>> universe_component = getUtility(IComponentSet)['universe']
 
265
    >>> queue_item = dapper.getQueueItems(status=PackageUploadStatus.NEW)[0]
265
266
 
266
 
  # Change the component where this package was attached.
267
 
  >>> queue_item.builds[0].build.source_package_release.override(
268
 
  ...     component=universe_component)
269
 
  >>> queue_item.customfiles[0].publish()
 
267
# Change the component where this package was attached.
 
268
    >>> queue_item.builds[0].build.source_package_release.override(
 
269
    ...     component=universe_component)
 
270
    >>> queue_item.customfiles[0].publish()
270
271
 
271
272
This time, we don't get any entry in the import queue.
272
273
 
273
 
  >>> translation_import_queue.getAllEntries(target=ubuntu).count()
274
 
  0
 
274
    >>> translation_import_queue.getAllEntries(target=ubuntu).count()
 
275
    0
275
276
 
276
 
  # Let's abort the transaction so we can check the same upload in a different
277
 
  # component.
278
 
  >>> transaction.abort()
 
277
# Let's abort the transaction so we can check the same upload in a different
 
278
# component.
 
279
    >>> transaction.abort()
279
280
 
280
281
 
281
282
Translations from PPA build
284
285
For now we simply ignore translations for archives other than the
285
286
Distribution archives (i.e. PPAs).
286
287
 
287
 
  >>> from lp.registry.interfaces.person import IPersonSet
288
 
  >>> from lp.soyuz.enums import ArchivePurpose
289
 
  >>> from lp.soyuz.interfaces.archive import IArchiveSet
290
 
 
291
 
  >>> foobar_archive = getUtility(IArchiveSet).new(
292
 
  ...     purpose=ArchivePurpose.PPA,
293
 
  ...     owner=getUtility(IPersonSet).getByName('name16'))
294
 
 
295
 
  >>> dapper = getUtility(IDistributionSet)['ubuntu']['dapper']
296
 
  >>> queue_item = dapper.getQueueItems(status=PackageUploadStatus.NEW)[0]
297
 
  >>> queue_item.archive = foobar_archive
298
 
 
299
 
  >>> queue_item.customfiles[0].publish(FakeLogger())
300
 
  DEBUG Publishing custom pmount, pmount_0.9.7-2ubuntu2_amd64_translations.tar.gz to ubuntu/dapper
301
 
  DEBUG Skipping translations since its purpose is not in
302
 
  MAIN_ARCHIVE_PURPOSES.
303
 
 
304
 
  # And this time, we see that there are no entries imported in the queue.
305
 
  >>> translation_import_queue.getAllEntries(target=ubuntu).count()
306
 
  0
307
 
  >>> transaction.abort()
 
288
    >>> from lp.registry.interfaces.person import IPersonSet
 
289
    >>> from lp.soyuz.enums import ArchivePurpose
 
290
    >>> from lp.soyuz.interfaces.archive import IArchiveSet
 
291
 
 
292
    >>> foobar_archive = getUtility(IArchiveSet).new(
 
293
    ...     purpose=ArchivePurpose.PPA,
 
294
    ...     owner=getUtility(IPersonSet).getByName('name16'))
 
295
 
 
296
    >>> dapper = getUtility(IDistributionSet)['ubuntu']['dapper']
 
297
    >>> queue_item = dapper.getQueueItems(status=PackageUploadStatus.NEW)[0]
 
298
    >>> queue_item.archive = foobar_archive
 
299
 
 
300
    >>> queue_item.customfiles[0].publish(FakeLogger())
 
301
    DEBUG Publishing custom pmount,
 
302
    pmount_0.9.7-2ubuntu2_amd64_translations.tar.gz to ubuntu/dapper
 
303
    DEBUG Skipping translations since its purpose is not in
 
304
    MAIN_ARCHIVE_PURPOSES.
 
305
 
 
306
# And this time, we see that there are no entries imported in the queue.
 
307
    >>> translation_import_queue.getAllEntries(target=ubuntu).count()
 
308
    0
 
309
    >>> transaction.abort()
308
310
 
309
311
 
310
312
Translations from a rebuild
312
314
 
313
315
Translations coming from rebuilt packages are also ignored.
314
316
 
315
 
  >>> from lp.registry.interfaces.person import IPersonSet
316
 
  >>> from lp.soyuz.interfaces.archive import ArchivePurpose, IArchiveSet
317
 
 
318
 
  >>> foobar_archive = getUtility(IArchiveSet).new(
319
 
  ...     purpose=ArchivePurpose.COPY,
320
 
  ...     owner=getUtility(IPersonSet).getByName('name16'),
321
 
  ...     name='rebuilds')
322
 
 
323
 
  >>> dapper = getUtility(IDistributionSet)['ubuntu']['dapper']
324
 
  >>> queue_item = dapper.getQueueItems(status=PackageUploadStatus.NEW)[0]
325
 
  >>> queue_item.archive = foobar_archive
326
 
 
327
 
  >>> queue_item.customfiles[0].publish(FakeLogger())
328
 
  DEBUG Publishing custom pmount, pmount_0.9.7-2ubuntu2_amd64_translations.tar.gz to ubuntu/dapper
329
 
  DEBUG Skipping translations since its purpose is not in
330
 
  MAIN_ARCHIVE_PURPOSES.
331
 
 
332
 
  # And this time, we see that there are no entries imported in the queue.
333
 
  >>> translation_import_queue.getAllEntries(target=ubuntu).count()
334
 
  0
 
317
    >>> from lp.registry.interfaces.person import IPersonSet
 
318
    >>> from lp.soyuz.interfaces.archive import ArchivePurpose, IArchiveSet
 
319
 
 
320
    >>> foobar_archive = getUtility(IArchiveSet).new(
 
321
    ...     purpose=ArchivePurpose.COPY,
 
322
    ...     owner=getUtility(IPersonSet).getByName('name16'),
 
323
    ...     name='rebuilds')
 
324
 
 
325
    >>> dapper = getUtility(IDistributionSet)['ubuntu']['dapper']
 
326
    >>> queue_item = dapper.getQueueItems(status=PackageUploadStatus.NEW)[0]
 
327
    >>> queue_item.archive = foobar_archive
 
328
 
 
329
    >>> queue_item.customfiles[0].publish(FakeLogger())
 
330
    DEBUG Publishing custom pmount,
 
331
    pmount_0.9.7-2ubuntu2_amd64_translations.tar.gz to ubuntu/dapper
 
332
    DEBUG Skipping translations since its purpose is not in
 
333
    MAIN_ARCHIVE_PURPOSES.
 
334
 
 
335
# And this time, we see that there are no entries imported in the queue.
 
336
    >>> translation_import_queue.getAllEntries(target=ubuntu).count()
 
337
    0
335
338
 
336
339
 
337
340
Translations importer: publishRosettaTranslations
341
344
PackageUploadCustom: these will emulate everything we need to document
342
345
different interpretations of "importer" in attachTranslationFiles.
343
346
 
344
 
  >>> from zope.interface import implements
345
 
  >>> from lp.app.interfaces.launchpad import ILaunchpadCelebrities
346
 
  >>> from lp.soyuz.model.queue import PackageUploadCustom
347
 
  >>> from lp.soyuz.interfaces.archive import (
348
 
  ...     IArchive, ArchivePurpose)
349
 
  >>> from lp.soyuz.interfaces.queue import (
350
 
  ...     IPackageUpload, IPackageUploadCustom)
351
 
  >>> from lp.registry.interfaces.person import IPerson
352
 
  >>> from lp.soyuz.enums import PackageUploadCustomFormat
353
 
  >>> from lp.soyuz.interfaces.component import IComponentSet
354
 
  >>> from lp.soyuz.interfaces.sourcepackagerelease import (
355
 
  ...     ISourcePackageRelease)
356
 
  >>> from lp.registry.interfaces.pocket import PackagePublishingPocket
357
 
 
358
 
  >>> class MockArchive:
359
 
  ...       implements(IArchive)
360
 
  ...       def __init__(self, purpose):
361
 
  ...           self.purpose = purpose
362
 
 
363
 
  >>> class MockSourcePackageRelease:
364
 
  ...       implements(ISourcePackageRelease)
365
 
  ...       def __init__(self, component, creator):
366
 
  ...           self.component = getUtility(IComponentSet)[component]
367
 
  ...           self.creator = creator
368
 
  ...           self.packageupload = 1
369
 
  ...
370
 
  ...       def attachTranslationFiles(self, file, imported, importer):
371
 
  ...           if (importer is not None and
372
 
  ...               not IPerson.providedBy(importer)):
373
 
  ...               print "`importer` not a person!"
374
 
  ...           print "Imported by: %s" % (getattr(importer, "name", "None"))
375
 
 
376
 
  >>> class MockPackageUpload:
377
 
  ...     implements(IPackageUpload)
378
 
  ...     def __init__(self, pocket, auto_sync, sourcepackagerelease,
379
 
  ...                  archive):
380
 
  ...         self.id = 1
381
 
  ...         self.pocket = pocket
382
 
  ...         self.auto_sync = auto_sync
383
 
  ...         self.sourcepackagerelease = sourcepackagerelease
384
 
  ...         self.archive = archive
385
 
  ...
386
 
  ...     def isAutoSyncUpload(self, changed_by_email=None):
387
 
  ...         return self.auto_sync
388
 
 
389
 
  >>> class MockPackageUploadCustom(PackageUploadCustom):
390
 
  ...     implements(IPackageUploadCustom)
391
 
  ...     packageupload = None
392
 
  ...
393
 
  ...     def __init__(self):
394
 
  ...         self.customformat = (
395
 
  ...             PackageUploadCustomFormat.ROSETTA_TRANSLATIONS)
 
347
    >>> from zope.interface import implements
 
348
    >>> from lp.app.interfaces.launchpad import ILaunchpadCelebrities
 
349
    >>> from lp.soyuz.model.queue import PackageUploadCustom
 
350
    >>> from lp.soyuz.interfaces.archive import (
 
351
    ...     IArchive, ArchivePurpose)
 
352
    >>> from lp.soyuz.interfaces.queue import (
 
353
    ...     IPackageUpload, IPackageUploadCustom)
 
354
    >>> from lp.registry.interfaces.person import IPerson
 
355
    >>> from lp.soyuz.enums import PackageUploadCustomFormat
 
356
    >>> from lp.soyuz.interfaces.component import IComponentSet
 
357
    >>> from lp.soyuz.interfaces.sourcepackagerelease import (
 
358
    ...     ISourcePackageRelease)
 
359
    >>> from lp.registry.interfaces.pocket import PackagePublishingPocket
 
360
 
 
361
    >>> class MockArchive:
 
362
    ...       implements(IArchive)
 
363
    ...       def __init__(self, purpose):
 
364
    ...           self.purpose = purpose
 
365
 
 
366
    >>> class MockSourcePackageRelease:
 
367
    ...       implements(ISourcePackageRelease)
 
368
    ...       def __init__(self, component, creator):
 
369
    ...           self.component = getUtility(IComponentSet)[component]
 
370
    ...           self.creator = creator
 
371
    ...           self.packageupload = 1
 
372
    ...
 
373
    ...       def attachTranslationFiles(self, file, imported, importer):
 
374
    ...           if (importer is not None and
 
375
    ...               not IPerson.providedBy(importer)):
 
376
    ...               print "`importer` not a person!"
 
377
    ...           print "Imported by: %s" % (
 
378
    ...               getattr(importer, "name", "None"))
 
379
 
 
380
    >>> class MockPackageUpload:
 
381
    ...     implements(IPackageUpload)
 
382
    ...     def __init__(self, pocket, auto_sync, sourcepackagerelease,
 
383
    ...                  archive):
 
384
    ...         self.id = 1
 
385
    ...         self.pocket = pocket
 
386
    ...         self.auto_sync = auto_sync
 
387
    ...         self.sourcepackagerelease = sourcepackagerelease
 
388
    ...         self.archive = archive
 
389
    ...
 
390
    ...     def isAutoSyncUpload(self, changed_by_email=None):
 
391
    ...         return self.auto_sync
 
392
 
 
393
    >>> class MockPackageUploadCustom(PackageUploadCustom):
 
394
    ...     implements(IPackageUploadCustom)
 
395
    ...     packageupload = None
 
396
    ...
 
397
    ...     def __init__(self):
 
398
    ...         self.customformat = (
 
399
    ...             PackageUploadCustomFormat.ROSETTA_TRANSLATIONS)
396
400
 
397
401
For translations from auto-synced packages we consider the importer to be
398
402
'katie' (archive@ubuntu.com).
399
403
 
400
 
  >>> katie = getUtility(ILaunchpadCelebrities).katie
401
 
  >>> release_pocket = PackagePublishingPocket.RELEASE
402
 
  >>> archive = MockArchive(ArchivePurpose.PRIMARY)
 
404
    >>> katie = getUtility(ILaunchpadCelebrities).katie
 
405
    >>> release_pocket = PackagePublishingPocket.RELEASE
 
406
    >>> archive = MockArchive(ArchivePurpose.PRIMARY)
403
407
 
404
 
  >>> katie_sourcepackagerelease = MockSourcePackageRelease('main', katie)
405
 
  >>> sync_package_upload = MockPackageUpload(
406
 
  ...     release_pocket, True, katie_sourcepackagerelease, archive)
407
 
  >>> sync_package_upload.isAutoSyncUpload()
408
 
  True
409
 
  >>> translations_upload = MockPackageUploadCustom()
410
 
  >>> translations_upload.packageupload = sync_package_upload
411
 
  >>> translations_upload.publishRosettaTranslations()
412
 
  Imported by: katie
 
408
    >>> katie_sourcepackagerelease = MockSourcePackageRelease('main', katie)
 
409
    >>> sync_package_upload = MockPackageUpload(
 
410
    ...     release_pocket, True, katie_sourcepackagerelease, archive)
 
411
    >>> sync_package_upload.isAutoSyncUpload()
 
412
    True
 
413
    >>> translations_upload = MockPackageUploadCustom()
 
414
    >>> translations_upload.packageupload = sync_package_upload
 
415
    >>> translations_upload.publishRosettaTranslations()
 
416
    Imported by: katie
413
417
 
414
418
Non-auto-sync uploads by 'katie' still indicate 'katie' as the uploader.
415
419
 
416
 
  >>> non_sync_package_upload = MockPackageUpload(
417
 
  ...     release_pocket, False, katie_sourcepackagerelease, archive)
418
 
  >>> non_sync_package_upload.isAutoSyncUpload()
419
 
  False
420
 
  >>> translations_upload.packageupload = non_sync_package_upload
421
 
  >>> translations_upload.publishRosettaTranslations()
422
 
  Imported by: katie
 
420
    >>> non_sync_package_upload = MockPackageUpload(
 
421
    ...     release_pocket, False, katie_sourcepackagerelease, archive)
 
422
    >>> non_sync_package_upload.isAutoSyncUpload()
 
423
    False
 
424
    >>> translations_upload.packageupload = non_sync_package_upload
 
425
    >>> translations_upload.publishRosettaTranslations()
 
426
    Imported by: katie
423
427
 
424
428
Uploads by anyone else are treated as if importer is the packager.
425
429
 
426
 
  >>> person_set = getUtility(IPersonSet)
427
 
  >>> carlos = person_set.getByName('carlos')
428
 
  >>> carlos_sourcepackagerelease = MockSourcePackageRelease('main', carlos)
429
 
  >>> carlos_package_upload = MockPackageUpload(
430
 
  ...     release_pocket, False, carlos_sourcepackagerelease, archive)
431
 
  >>> carlos_package_upload.isAutoSyncUpload()
432
 
  False
433
 
  >>> translations_upload.packageupload = carlos_package_upload
434
 
  >>> translations_upload.publishRosettaTranslations()
435
 
  Imported by: carlos
 
430
    >>> person_set = getUtility(IPersonSet)
 
431
    >>> carlos = person_set.getByName('carlos')
 
432
    >>> carlos_sourcepackagerelease = MockSourcePackageRelease('main', carlos)
 
433
    >>> carlos_package_upload = MockPackageUpload(
 
434
    ...     release_pocket, False, carlos_sourcepackagerelease, archive)
 
435
    >>> carlos_package_upload.isAutoSyncUpload()
 
436
    False
 
437
    >>> translations_upload.packageupload = carlos_package_upload
 
438
    >>> translations_upload.publishRosettaTranslations()
 
439
    Imported by: carlos
436
440
 
437
441
 
438
442
Translations tarball
442
446
source package points to a tarball with translations files for the
443
447
package.
444
448
 
445
 
  >>> import tarfile
446
 
  >>> from StringIO import StringIO
447
 
  >>> tarball = StringIO(latest_translations_upload.read())
448
 
  >>> archive = tarfile.open('', 'r|gz', tarball)
449
 
  >>> translation_files = sorted([
450
 
  ...     entry.name for entry in archive.getmembers()
451
 
  ...     if entry.name.endswith('.po') or entry.name.endswith('.pot')
452
 
  ...     ])
453
 
  >>> for filename in translation_files:
454
 
  ...     print filename
455
 
  ./source/po/ca.po
456
 
  ./source/po/cs.po
457
 
  ./source/po/de.po
458
 
  ...
459
 
  ./source/po/pmount.pot
 
449
    >>> import tarfile
 
450
    >>> from StringIO import StringIO
 
451
    >>> tarball = StringIO(latest_translations_upload.read())
 
452
    >>> archive = tarfile.open('', 'r|gz', tarball)
 
453
    >>> translation_files = sorted([
 
454
    ...     entry.name for entry in archive.getmembers()
 
455
    ...     if entry.name.endswith('.po') or entry.name.endswith('.pot')
 
456
    ...     ])
 
457
    >>> for filename in translation_files:
 
458
    ...     print filename
 
459
    ./source/po/ca.po
 
460
    ./source/po/cs.po
 
461
    ./source/po/de.po
 
462
    ...
 
463
    ./source/po/pmount.pot