source: mergebot/trunk/mergebot/MergeActor.py

Last change on this file was 33, checked in by retracile, 14 years ago

Mergebot: begin refactoring svn layer

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.svn import SvnLib
12SvnOps = SvnLib()
13from mergebot.Actor import Actor
14
15class 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
Note: See TracBrowser for help on using the repository browser.