[16] | 1 | #!/usr/bin/env python |
---|
| 2 | """ |
---|
| 3 | Verify that a branch can be merged to its trunk without conflicts, but don't |
---|
| 4 | commit the merge. |
---|
| 5 | """ |
---|
| 6 | |
---|
| 7 | import os |
---|
[17] | 8 | import shutil |
---|
[16] | 9 | |
---|
[37] | 10 | from mergebot.svn import SvnLib |
---|
[33] | 11 | SvnOps = SvnLib() |
---|
[17] | 12 | from mergebot.Actor import Actor |
---|
[16] | 13 | |
---|
[17] | 14 | class CheckMergeActor(Actor): |
---|
| 15 | """Checks that this ticket can be merged to its baseline, but don't modify |
---|
| 16 | the repository. |
---|
[16] | 17 | """ |
---|
[17] | 18 | def execute(self): |
---|
| 19 | """ |
---|
| 20 | Verify that a branch can be merged to its trunk without conflicts, but |
---|
| 21 | don't commit the merge. |
---|
| 22 | """ |
---|
| 23 | results = {} |
---|
| 24 | workdir = self.work_dir |
---|
| 25 | logfile = self.logfilename() |
---|
[16] | 26 | |
---|
[17] | 27 | if os.path.exists(workdir): |
---|
| 28 | shutil.rmtree(workdir) |
---|
[16] | 29 | |
---|
[17] | 30 | # Make sure the various urls we require do exist |
---|
[24] | 31 | problems = self.check_required_directories() |
---|
| 32 | if problems: |
---|
| 33 | return results, problems, False |
---|
[16] | 34 | |
---|
[17] | 35 | branch_info = SvnOps.get_branch_info(self.branch_local_url(), logfile) |
---|
| 36 | if not branch_info: |
---|
| 37 | comment = 'Branch for ticket %s does not exist in the repository.' \ |
---|
| 38 | % (self.ticket) |
---|
| 39 | return results, comment, False |
---|
| 40 | startrev, endrev = branch_info |
---|
[16] | 41 | |
---|
[17] | 42 | SvnOps.checkout(self.baseline_local_url(), workdir, logfile) |
---|
| 43 | # TODO: check return code of the above |
---|
| 44 | merge_results = SvnOps.merge(self.branch_local_url(), workdir, |
---|
| 45 | (startrev, endrev), logfile) |
---|
| 46 | conflicts = SvnOps.conflicts_from_merge_results(merge_results) |
---|
| 47 | if conflicts: |
---|
| 48 | message = '\n'.join([ |
---|
| 49 | 'Found %s conflicts while checking merge of %s:%s to %s for ' \ |
---|
| 50 | '%s.' % (len(conflicts), startrev, endrev, self.version, |
---|
| 51 | self.requestor), |
---|
| 52 | 'Files in conflict:', |
---|
| 53 | '{{{', |
---|
| 54 | '\n'.join(conflicts), |
---|
| 55 | '}}}', |
---|
| 56 | 'A rebranch will be needed before this can be merged.', |
---|
| 57 | ]) |
---|
| 58 | success = False |
---|
| 59 | else: |
---|
| 60 | message = 'Found no conflicts while checking merge of %s:%s to ' \ |
---|
| 61 | '%s for %s.' % (startrev, endrev, self.version, self.requestor) |
---|
| 62 | success = True |
---|
[16] | 63 | |
---|
[17] | 64 | # Clean up the work area |
---|
| 65 | if os.path.exists(workdir): |
---|
| 66 | shutil.rmtree(workdir) |
---|
[16] | 67 | |
---|
[17] | 68 | return results, message, success |
---|
[16] | 69 | |
---|
| 70 | # vim:foldcolumn=4 foldmethod=indent |
---|
| 71 | # vim:tabstop=4 shiftwidth=4 softtabstop=4 expandtab |
---|