source: mergebot/trunk/mergebot/MergeActor.py @ 24

Last change on this file since 24 was 24, checked in by retracile, 15 years ago

Ticket #2: merge to trunk

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