1 | #!/usr/bin/env python |
---|
2 | """ |
---|
3 | Syntax: MergeActor.py ticketnum component version requestor |
---|
4 | |
---|
5 | Merge a branch to its trunk. |
---|
6 | """ |
---|
7 | |
---|
8 | import os |
---|
9 | import shutil |
---|
10 | |
---|
11 | from mergebot.svn import SvnLib |
---|
12 | SvnOps = SvnLib() |
---|
13 | from mergebot.Actor import Actor |
---|
14 | |
---|
15 | class MergeActor(Actor): |
---|
16 | """Merges a branch to the line of development on which it is based. |
---|
17 | """ |
---|
18 | def execute(self): |
---|
19 | "Merge a branch to its trunk" |
---|
20 | results = {} |
---|
21 | logfile = self.logfilename() |
---|
22 | checkoutdir = self.work_dir |
---|
23 | # Delete the working directory so we get a completely clean working |
---|
24 | # copy. |
---|
25 | if os.path.exists(checkoutdir): |
---|
26 | shutil.rmtree(checkoutdir) |
---|
27 | |
---|
28 | # Make sure the various urls we require do exist |
---|
29 | problems = self.check_required_directories() |
---|
30 | if problems: |
---|
31 | return results, problems, False |
---|
32 | |
---|
33 | rev_info = SvnOps.get_branch_info(self.branch_local_url(), logfile) |
---|
34 | if not rev_info: |
---|
35 | comment = 'Branch for ticket %s does not exist in the repository.' \ |
---|
36 | % (self.ticket) |
---|
37 | return results, comment, False |
---|
38 | startrev, endrev = rev_info |
---|
39 | |
---|
40 | SvnOps.checkout(self.baseline_local_url(), checkoutdir, logfile) |
---|
41 | # FIXME: check return code |
---|
42 | merge_results = SvnOps.merge(self.branch_local_url(), checkoutdir, |
---|
43 | (startrev, endrev), logfile) |
---|
44 | conflicts = SvnOps.conflicts_from_merge_results(merge_results) |
---|
45 | if conflicts: |
---|
46 | comment = "\n".join([ |
---|
47 | "Found %s conflicts in attempt to merge %s:%s to %s for %s." % \ |
---|
48 | (len(conflicts), startrev, endrev, self.version, |
---|
49 | self.requestor), |
---|
50 | "Files in conflict:", |
---|
51 | "{{{", |
---|
52 | "\n".join(conflicts), |
---|
53 | "}}}", |
---|
54 | "A rebranch will be needed before this can be merged.", |
---|
55 | ]) |
---|
56 | results['mergebotstate'] = 'conflicts' |
---|
57 | success = False |
---|
58 | else: |
---|
59 | # The merge worked, so commit the changes. |
---|
60 | commitmessage = "\n".join([ |
---|
61 | "Ticket #%s: %s" % (self.ticket, self.summary), |
---|
62 | " Merge of %s:%s to %s for %s." % (startrev, endrev, |
---|
63 | self.version, self.requestor), |
---|
64 | ]) |
---|
65 | committedrev = SvnOps.commit(checkoutdir, commitmessage, logfile) |
---|
66 | # Sed message and endstatus |
---|
67 | if committedrev == None: |
---|
68 | # Apparently nothing to commit. |
---|
69 | comment = "\n".join([ |
---|
70 | "Merged %s:%s to %s for %s." % (startrev, endrev, |
---|
71 | self.version, self.requestor), |
---|
72 | "No changes to commit.", |
---|
73 | ]) |
---|
74 | results['mergebotstate'] = 'merged' |
---|
75 | success = True |
---|
76 | elif committedrev >= 0: |
---|
77 | # The commit succeeded. |
---|
78 | comment = "\n".join([ |
---|
79 | "Merged %s:%s to %s for %s." % (startrev, endrev, |
---|
80 | self.version, self.requestor), |
---|
81 | "Changeset [%s]. [source:%s/%s@%s]" % (committedrev, |
---|
82 | self.component, self.version_subdir(), committedrev), |
---|
83 | ]) |
---|
84 | results['mergebotstate'] = 'merged' |
---|
85 | success = True |
---|
86 | else: |
---|
87 | # The commit for the merge failed. |
---|
88 | comment = \ |
---|
89 | "Commit failed in attempt to merge %s:%s to %s for %s." \ |
---|
90 | % (startrev, endrev, self.version, self.requestor) |
---|
91 | #results['mergebotstate'] = 'mergefailed' |
---|
92 | success = False |
---|
93 | |
---|
94 | # Clean up the work area |
---|
95 | if os.path.exists(checkoutdir): |
---|
96 | shutil.rmtree(checkoutdir) |
---|
97 | |
---|
98 | return results, comment, success |
---|
99 | |
---|
100 | # vim:foldcolumn=4 foldmethod=indent |
---|
101 | # vim:tabstop=4 shiftwidth=4 softtabstop=4 expandtab |
---|