source: mergebot/trunk/mergebot/CheckMergeActor.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: 2.7 KB
Line 
1#!/usr/bin/env python
2"""
3Syntax: MergeActor.py ticketnum component version requestor
4
5Verify that a branch can be merged to its trunk without conflicts, but don't
6commit the merge.
7"""
8
9import os
10import sys
11import trac.env
12
13import SvnOps
14from WorkQueue import MergeBotActor, VersionToDir
15from TrackerTools import GetWorkDir, GetRepositoryLocalUrl, Task, GetLogFile
16
17def check_merge_action(trac_env, ticketnum, component, version, requestor):
18    """
19    Verify that a branch can be merged to its trunk without conflicts, but
20    don't commit the merge.
21    """
22    task_obj = Task(trac_env, ticketnum)
23    endstatus = "???????"
24    workdir = GetWorkDir(trac_env, ticketnum, __name__)
25    logfile = GetLogFile(trac_env, ticketnum)
26    # FIXME: Should we just bail out instead?
27    if os.path.exists(workdir):
28        os.system("rm -rf \"%s\"" % (workdir))
29
30    sourceurl = os.path.join(GetRepositoryLocalUrl(trac_env), component,
31        VersionToDir(version))
32    ticketurl = os.path.join(GetRepositoryLocalUrl(trac_env), component, "branches",
33        "ticket-%s" % ticketnum)
34
35    branch_info = SvnOps.get_branch_info(ticketurl, GetLogFile(trac_env, ticketnum))
36    # FIXME: if not branch_info: # Error case
37    startrev, endrev = branch_info
38
39    SvnOps.checkout(sourceurl, workdir, logfile)
40    # TODO: check return code of the above
41    results = SvnOps.merge(ticketurl, workdir, (startrev, endrev), logfile)
42    conflicts = SvnOps.conflicts_from_merge_results(results)
43    if conflicts:
44        message = "\n".join([
45            "Found %s conflicts while checking merge of %s:%s to %s for %s." % \
46                (len(conflicts), startrev, endrev, version, requestor),
47            "Files in conflict:",
48            "{{{",
49            "\n".join(conflicts),
50            "}}}",
51            "A rebranch will be needed before this can be merged.",
52        ])
53        endstatus = "conflicts"
54    else:
55        message = \
56            "Found no conflicts while checking merge of %s:%s to %s for %s." \
57            % (startrev, endrev, version, requestor)
58        endstatus = "branched"
59
60    # Clean up the work area
61    os.system("rm -rf \"%s\"" % (workdir, ))
62
63    task_obj.AddComment(message)
64    return endstatus, task_obj
65
66class CheckMergeActor(MergeBotActor):
67    "Actor wrapper for the check_merge_action"
68    def __init__(self, trac_env):
69        MergeBotActor.__init__(self, trac_env, "checkmerge", check_merge_action)
70
71def main():
72    tracdir = sys.argv[1]
73    trac_env = trac.env.open_environment(tracdir)
74    mergingActor = CheckMergeActor(trac_env)
75    mergingActor.AddTask(sys.argv[1:])
76    mergingActor.Run()
77
78if __name__ == "__main__":
79    main()
80
81# vim:foldcolumn=4 foldmethod=indent
82# vim:tabstop=4 shiftwidth=4 softtabstop=4 expandtab
Note: See TracBrowser for help on using the repository browser.