~tarmac-control-tower/tarmac/main

« back to all changes in this revision

Viewing changes to tarmac/bin/commands.py

  • Committer: Tarmac
  • Author(s): Rodney Dawes
  • Date: 2010-08-05 16:20:43 UTC
  • mfrom: (328.1.2 unapproved-revisions-comment)
  • Revision ID: paul@eventuallyanyway.com-20100805162043-jwwh23628dlsanmw
Unify error handling for merge failure or rejection
Add UnaprovedChanges exception for when tip is newer than approved revision

Show diffs side-by-side

added added

removed removed

Lines of Context:
5
5
import re
6
6
 
7
7
from bzrlib.commands import Command
8
 
from bzrlib.errors import PointlessMerge
 
8
from bzrlib.errors import PointlessMerge, TipChangeRejected
9
9
from bzrlib.help import help_commands
10
10
from launchpadlib.launchpad import (Credentials, Launchpad, EDGE_SERVICE_ROOT,
11
11
    STAGING_SERVICE_ROOT)
15
15
from tarmac.config import TarmacConfig
16
16
from tarmac.hooks import tarmac_hooks
17
17
from tarmac.log import set_up_debug_logging, set_up_logging
18
 
from tarmac.exceptions import BranchHasConflicts, TarmacCommandError
 
18
from tarmac.exceptions import (BranchHasConflicts, TarmacCommandError,
 
19
                               UnapprovedChanges)
19
20
from tarmac.plugin import load_plugins
20
21
 
21
22
 
146
147
                    proposal.source_branch, self.config)
147
148
 
148
149
                try:
 
150
                    approved = proposal.reviewed_revid
 
151
                    tip = proposal.source_branch.revision_count
 
152
                    if tip > approved:
 
153
                        raise UnapprovedChanges(
 
154
                            'Unapproved changes to branch after approval.')
 
155
 
149
156
                    self.logger.debug(
150
157
                        'Merging %(source)s at revision %(revision)s' % {
151
158
                            'source': proposal.source_branch.display_name,
152
159
                            'revision': proposal.reviewed_revid,})
 
160
 
153
161
                    target.merge(
154
162
                        source,
155
163
                        str(proposal.reviewed_revid))
156
164
 
157
 
                except BranchHasConflicts:
158
 
                    subject = (
159
 
                        u"Conflicts merging %(source)s into %(target)s" % {
160
 
                             "source": proposal.source_branch.display_name,
161
 
                             "target": proposal.target_branch.display_name})
162
 
                    comment = (
163
 
                        u'Attempt to merge %(source)s into %(target)s failed '
164
 
                        u'due to merge conflicts:\n\n%(output)s' % {
165
 
                            "source": proposal.source_branch.display_name,
166
 
                            "target": proposal.target_branch.display_name,
167
 
                            "output": target.conflicts})
 
165
                except Exception, failure:
 
166
                    subject = u'Re: [Merge] %(source)s into %(target)s' % {
 
167
                        "source": proposal.source_branch.display_name,
 
168
                        "target": proposal.target_branch.display_name,}
 
169
                    comment = None
 
170
                    if isinstance(BranchHasConflicts, failure):
 
171
                        self.logger.warn(
 
172
                            u'Conflicts merging %(source)s into %(target)s' % {
 
173
                                "source": proposal.source_branch.display_name,
 
174
                                "target": proposal.target_branch.display_name})
 
175
                        comment = (
 
176
                            u'Attempt to merge %(source)s into %(target)s '
 
177
                            u'failed due to merge conflicts:\n\n%(output)s' % {
 
178
                                "source": proposal.source_branch.display_name,
 
179
                                "target": proposal.target_branch.display_name,
 
180
                                "output": target.conflicts})
 
181
                    elif isinstance(PointlessMerge, failure):
 
182
                        self.logger.warn(
 
183
                            'Merging %(source)s into %(target)s would be '
 
184
                            'pointless.' % {
 
185
                                'source': proposal.source_branch.display_name,
 
186
                                'target': proposal.target_branch.display_name,})
 
187
                        comment = (
 
188
                            u'There is no resulting diff between %(source)s '
 
189
                            u'and %(target)s.' % {
 
190
                                "source": proposal.source_branch.display_name,
 
191
                                "target": proposal.target_branch.display_name,})
 
192
                    elif isinstance(TipChangeRejected, failure):
 
193
                        comment = failure.msg
 
194
                    elif isinstance(UnapprovedChanges, failure):
 
195
                        self.logger.warn(
 
196
                            u'Unapproved chagnes to %(source) were made '
 
197
                            u'after approval for merge into %(target).' % {
 
198
                                "source": proposal.source_branch.display_name,
 
199
                                "target": proposal.target_branch.display_name,})
 
200
                        comment = (
 
201
                            u'There are additional revisions which have not '
 
202
                            u'been approved in review. Please seek review and '
 
203
                            u'approval of these revisions as well.')
 
204
                    else:
 
205
                        raise failure
 
206
 
168
207
                    proposal.createComment(subject=subject, content=comment)
169
 
                    proposal.setStatus(status=u"Needs review")
 
208
                    proposal.setStatus(status=u'Needs review')
170
209
                    proposal.lp_save()
171
210
                    self.logger.warn(
172
211
                        'Conflicts found while merging %(source)s into '
176
215
                    target.cleanup()
177
216
                    continue
178
217
 
179
 
                except PointlessMerge:
180
 
                    self.logger.warn(
181
 
                        'Merging %(source)s into %(target)s would be '
182
 
                        'pointless.' % {
183
 
                            'source': proposal.source_branch.display_name,
184
 
                            'target': proposal.target_branch.display_name,})
185
 
 
186
 
                    subject = (
187
 
                        u"Pointless merge" % {
188
 
                             "source": proposal.source_branch.display_name,
189
 
                             "target": proposal.target_branch.display_name})
190
 
                    comment = (
191
 
                        u'There is no resulting diff between %(source)s '
192
 
                        u'and %(target)s.' % {
193
 
                            "source": proposal.source_branch.display_name,
194
 
                            "target": proposal.target_branch.display_name,})
195
 
                    proposal.createComment(subject=subject, content=comment)
196
 
                    proposal.setStatus(status=u"Needs review")
197
 
                    proposal.lp_save()
198
 
 
199
 
                    target.cleanup()
200
 
                    continue
201
 
 
202
218
                urlp = re.compile('http[s]?://api\.(.*)launchpad\.net/beta/')
203
219
                merge_url = urlp.sub(
204
220
                    'http://launchpad.net/', proposal.self_link)