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

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

Mergebot: Codebase as released with permission from CommProve?, plus cleanups to remove traces of that environment.

File size: 3.6 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 sys
10import trac.env
11
12import SvnOps
13from WorkQueue import MergeBotActor, VersionToDir
14from TrackerTools import GetWorkDir, GetRepositoryLocalUrl, Task, GetLogFile
15
16def merge_action(trac_env, ticketnum, component, version, requestor):
17    "Merge a branch to its trunk"
18    task_obj = Task(trac_env, ticketnum)
19    logfile = GetLogFile(trac_env, ticketnum)
20
21    checkoutdir = GetWorkDir(trac_env, ticketnum, __name__)
22    # FIXME: Should we just bail out instead?
23    if os.path.exists(checkoutdir):
24        os.system("rm -rf \"%s\" >>%s 2>&1" % (checkoutdir, logfile))
25
26    sourceurl = os.path.join(GetRepositoryLocalUrl(trac_env), component,
27        VersionToDir(version))
28    ticketurl = os.path.join(GetRepositoryLocalUrl(trac_env), component, "branches",
29        "ticket-%s" % ticketnum)
30
31    # FIXME: needs error checking
32    startrev, endrev = SvnOps.get_branch_info(ticketurl, logfile)
33
34    SvnOps.checkout(sourceurl, checkoutdir, logfile)
35    # FIXME: check return code
36    results = SvnOps.merge(ticketurl, checkoutdir, (startrev, endrev), logfile)
37    conflicts = SvnOps.conflicts_from_merge_results(results)
38    if conflicts:
39        message = "\n".join([
40            "Found %s conflicts in attempt to merge %s:%s to %s for %s." % \
41                (len(conflicts), startrev, endrev, version, requestor),
42            "Files in conflict:",
43            "{{{",
44            "\n".join(conflicts),
45            "}}}",
46            "A rebranch will be needed before this can be merged.",
47        ])
48        endstatus = "conflicts"
49    else:
50        # The merge worked, so commit the changes.
51        summary = task_obj.GetSummary()
52        commitmessage = "\n".join([
53            "Ticket #%s: %s" % (ticketnum, summary),
54            "    Merge of %s:%s to %s for %s." % (startrev, endrev, version,
55                requestor),
56        ])
57        committedrev = SvnOps.commit(checkoutdir, commitmessage, logfile)
58        # Sed message and endstatus
59        if committedrev == None:
60            # Apparently nothing to commit.
61            message = "\n".join([
62                "Merged %s:%s to %s for %s." % (startrev, endrev, version,
63                    requestor),
64                "No changes to commit.",
65            ])
66            endstatus = "merged"
67        elif committedrev >= 0:
68            # The commit succeeded.
69            message = "\n".join([
70                "Merged %s:%s to %s for %s." % (startrev, endrev, version,
71                    requestor),
72                "Changeset [%s]. [source:%s/%s@%s]" % (committedrev,
73                    component, VersionToDir(version), committedrev),
74            ])
75            endstatus = "merged"
76        else:
77            # The commit for the merge failed.
78            message = "Commit failed in attempt to merge %s:%s to %s for %s." \
79                % (startrev, endrev, version, requestor)
80            endstatus = "mergefailed"
81
82    # Clean up the work area
83    os.system("rm -rf \"%s\" >>%s 2>&1" % (checkoutdir, logfile))
84
85    task_obj.AddComment(message)
86    return endstatus, task_obj
87
88class MergeActor(MergeBotActor):
89    "Actor wrapper for merge_action"
90    def __init__(self, trac_env):
91        MergeBotActor.__init__(self, trac_env, "merge", merge_action)
92
93def main():
94    tracdir = sys.argv[1]
95    trac_env = trac.env.open_environment(tracdir)
96    mergingActor = MergeActor(trac_env)
97    mergingActor.AddTask(sys.argv[2:])
98    mergingActor.Run()
99
100if __name__ == "__main__":
101    main()
102
103# vim:foldcolumn=4 foldmethod=indent
104# vim:tabstop=4 shiftwidth=4 softtabstop=4 expandtab
Note: See TracBrowser for help on using the repository browser.