~launchpad-pqm/launchpad/devel

« back to all changes in this revision

Viewing changes to lib/lp/code/model/branchmergeproposaljob.py

  • Committer: Steve Kowalik
  • Date: 2011-08-07 04:05:52 UTC
  • mto: This revision was merged to the branch mainline in revision 13626.
  • Revision ID: stevenk@ubuntu.com-20110807040552-mwnxo0flmhvl35e8
Correct the notification based on review comments, and remove request{,ed}
from the function names, switching to create{,d}.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright 2009-2011 Canonical Ltd.  This software is licensed under the
 
1
# Copyright 2009, 2010 Canonical Ltd.  This software is licensed under the
2
2
# GNU Affero General Public License version 3 (see the file LICENSE).
3
3
 
4
4
 
59
59
    implements,
60
60
    )
61
61
 
62
 
from lp.code.adapters.branch import BranchMergeProposalDelta
 
62
from canonical.config import config
 
63
from canonical.database.enumcol import EnumCol
 
64
from lp.services.messages.model.message import (
 
65
    MessageJob,
 
66
    MessageJobAction,
 
67
    )
 
68
from lp.services.messages.interfaces.message import IMessageJob
 
69
from canonical.launchpad.webapp import errorlog
 
70
from canonical.launchpad.webapp.interaction import setupInteraction
 
71
from canonical.launchpad.webapp.interfaces import (
 
72
    DEFAULT_FLAVOR,
 
73
    IPlacelessAuthUtility,
 
74
    IStoreSelector,
 
75
    MAIN_STORE,
 
76
    MASTER_FLAVOR,
 
77
    )
63
78
from lp.code.enums import BranchType
64
 
from lp.code.errors import (
65
 
    BranchHasPendingWrites,
66
 
    UpdatePreviewDiffNotReady,
67
 
    )
68
79
from lp.code.interfaces.branchmergeproposal import (
69
80
    IBranchMergeProposalJob,
70
81
    IBranchMergeProposalJobSource,
94
105
    get_rw_server,
95
106
    )
96
107
from lp.registry.interfaces.person import IPersonSet
97
 
from lp.services.config import config
98
 
from lp.services.database.enumcol import EnumCol
99
 
from lp.services.database.stormbase import StormBase
100
108
from lp.services.job.interfaces.job import JobStatus
101
109
from lp.services.job.model.job import Job
102
110
from lp.services.job.runner import (
104
112
    BaseRunnableJobSource,
105
113
    )
106
114
from lp.services.mail.sendmail import format_address_for_person
107
 
from lp.services.messages.interfaces.message import IMessageJob
108
 
from lp.services.messages.model.message import (
109
 
    MessageJob,
110
 
    MessageJobAction,
111
 
    )
112
 
from lp.services.webapp import errorlog
113
 
from lp.services.webapp.interaction import setupInteraction
114
 
from lp.services.webapp.interfaces import (
115
 
    DEFAULT_FLAVOR,
116
 
    IPlacelessAuthUtility,
117
 
    IStoreSelector,
118
 
    MAIN_STORE,
119
 
    MASTER_FLAVOR,
120
 
    )
 
115
from lp.services.database.stormbase import StormBase
121
116
 
122
117
 
123
118
class BranchMergeProposalJobType(DBEnumeratedType):
332
327
             self.branch_merge_proposal.target_branch.bzr_identity))
333
328
 
334
329
 
 
330
class UpdatePreviewDiffNotReady(Exception):
 
331
    """Raised if the the preview diff is not ready to run."""
 
332
 
 
333
 
335
334
class UpdatePreviewDiffJob(BranchMergeProposalJobDerived):
336
335
    """A job to update the preview diff for a branch merge proposal.
337
336
 
346
345
 
347
346
    user_error_types = (UpdatePreviewDiffNotReady, )
348
347
 
349
 
    retry_error_types = (BranchHasPendingWrites, )
350
 
 
351
 
    max_retries = 20
352
 
 
353
348
    def checkReady(self):
354
349
        """Is this job ready to run?"""
355
350
        bmp = self.branch_merge_proposal
360
355
            raise UpdatePreviewDiffNotReady(
361
356
                'The target branch has no revisions.')
362
357
        if bmp.source_branch.pending_writes:
363
 
            raise BranchHasPendingWrites(
 
358
            raise UpdatePreviewDiffNotReady(
364
359
                'The source branch has pending writes.')
365
360
 
 
361
    @staticmethod
 
362
    @contextlib.contextmanager
 
363
    def contextManager():
 
364
        """See `IUpdatePreviewDiffJobSource`."""
 
365
        errorlog.globalErrorUtility.configure('update_preview_diffs')
 
366
        server = get_ro_server()
 
367
        server.start_server()
 
368
        yield
 
369
        server.stop_server()
 
370
 
366
371
    def acquireLease(self, duration=600):
367
372
        return self.job.acquireLease(duration)
368
373
 
371
376
        self.checkReady()
372
377
        preview = PreviewDiff.fromBranchMergeProposal(
373
378
            self.branch_merge_proposal)
374
 
        with BranchMergeProposalDelta.monitor(
375
 
            self.branch_merge_proposal):
376
 
            self.branch_merge_proposal.preview_diff = preview
 
379
        self.branch_merge_proposal.preview_diff = preview
377
380
 
378
381
    def getOperationDescription(self):
379
382
        return ('generating the diff for a merge proposal')
808
811
            if IUpdatePreviewDiffJob.providedBy(derived_job):
809
812
                try:
810
813
                    derived_job.checkReady()
811
 
                except (UpdatePreviewDiffNotReady, BranchHasPendingWrites):
 
814
                except UpdatePreviewDiffNotReady:
812
815
                    # If the job was created under 15 minutes ago wait a bit.
813
816
                    minutes = (
814
817
                        config.codehosting.update_preview_diff_ready_timeout)