aboutsummaryrefslogtreecommitdiffstats
path: root/libbe/command/merge.py
diff options
context:
space:
mode:
authorW. Trevor King <wking@drexel.edu>2009-12-14 20:13:30 -0500
committerW. Trevor King <wking@drexel.edu>2009-12-14 20:13:30 -0500
commit0f87a22c20a019f49455005542d4c60216ce39d2 (patch)
treecc049719dfeb4ba385c2e34b71a2ee8c03a92c69 /libbe/command/merge.py
parent3e5823d0985a54dec37f103dc72fda604d12a948 (diff)
downloadbugseverywhere-0f87a22c20a019f49455005542d4c60216ce39d2.tar.gz
Transitioned merge to Command-format
Diffstat (limited to 'libbe/command/merge.py')
-rw-r--r--libbe/command/merge.py164
1 files changed, 92 insertions, 72 deletions
diff --git a/libbe/command/merge.py b/libbe/command/merge.py
index ac09b40..4624ab7 100644
--- a/libbe/command/merge.py
+++ b/libbe/command/merge.py
@@ -14,41 +14,52 @@
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-"""Merge duplicate bugs"""
-from libbe import cmdutil, bugdir
-import os, copy
-__desc__ = __doc__
-def execute(args, manipulate_encodings=True, restrict_file_access=False,
- dir="."):
- """
- >>> from libbe import utility
- >>> bd = bugdir.SimpleBugDir()
- >>> bd.set_sync_with_disk(True)
- >>> a = bd.bug_from_shortname("a")
+import copy
+import os
+
+import libbe
+import libbe.command
+import libbe.command.util
+
+
+class Merge (libbe.command.Command):
+ """Merge duplicate bugs
+
+ >>> import sys
+ >>> import libbe.bugdir
+ >>> import libbe.comment
+ >>> bd = libbe.bugdir.SimpleBugDir(memory=False)
+ >>> cmd = Merge()
+ >>> cmd._setup_io = lambda i_enc,o_enc : None
+ >>> cmd.stdout = sys.stdout
+
+ >>> a = bd.bug_from_uuid('a')
>>> a.comment_root.time = 0
- >>> dummy = a.new_comment("Testing")
+ >>> dummy = a.new_comment('Testing')
>>> dummy.time = 1
- >>> dummy = dummy.new_reply("Testing...")
+ >>> dummy = dummy.new_reply('Testing...')
>>> dummy.time = 2
- >>> b = bd.bug_from_shortname("b")
- >>> b.status = "open"
+ >>> b = bd.bug_from_uuid('b')
+ >>> b.status = 'open'
>>> b.comment_root.time = 0
- >>> dummy = b.new_comment("1 2")
+ >>> dummy = b.new_comment('1 2')
>>> dummy.time = 1
- >>> dummy = dummy.new_reply("1 2 3 4")
+ >>> dummy = dummy.new_reply('1 2 3 4')
>>> dummy.time = 2
- >>> os.chdir(bd.root)
- >>> execute(["a", "b"], manipulate_encodings=False)
- Merging bugs a and b
- >>> bd._clear_bugs()
- >>> a = bd.bug_from_shortname("a")
+
+ >>> ret = cmd.run(bd.storage, bd, {}, ['/a', '/b'])
+ Merged bugs #abc/a# and #abc/b#
+ >>> bd.flush_reload()
+ >>> a = bd.bug_from_uuid('a')
>>> a.load_comments()
- >>> mergeA = a.comment_from_shortname(":3")
+ >>> a_comments = sorted([c for c in a.comments()],
+ ... cmp=libbe.comment.cmp_time)
+ >>> mergeA = a_comments[0]
>>> mergeA.time = 3
>>> print a.string(show_comments=True) # doctest: +ELLIPSIS
ID : a
- Short name : a
+ Short name : abc/a
Severity : minor
Status : open
Assigned :
@@ -57,42 +68,44 @@ def execute(args, manipulate_encodings=True, restrict_file_access=False,
Created : ...
Bug A
--------- Comment ---------
- Name: a:1
+ Name: abc/a/...
From: ...
Date: ...
<BLANKLINE>
Testing
--------- Comment ---------
- Name: a:2
+ Name: abc/a/...
From: ...
Date: ...
<BLANKLINE>
Testing...
--------- Comment ---------
- Name: a:3
+ Name: abc/a/...
From: ...
Date: ...
<BLANKLINE>
- Merged from bug b
+ Merged from bug #abc/b#
--------- Comment ---------
- Name: a:4
+ Name: abc/a/...
From: ...
Date: ...
<BLANKLINE>
1 2
--------- Comment ---------
- Name: a:5
+ Name: abc/a/...
From: ...
Date: ...
<BLANKLINE>
1 2 3 4
- >>> b = bd.bug_from_shortname("b")
+ >>> b = bd.bug_from_uuid('b')
>>> b.load_comments()
- >>> mergeB = b.comment_from_shortname(":3")
+ >>> b_comments = sorted([c for c in b.comments()],
+ ... libbe.comment.cmp_time)
+ >>> mergeB = b_comments[0]
>>> mergeB.time = 3
>>> print b.string(show_comments=True) # doctest: +ELLIPSIS
ID : b
- Short name : b
+ Short name : abc/b
Severity : minor
Status : closed
Assigned :
@@ -101,66 +114,73 @@ def execute(args, manipulate_encodings=True, restrict_file_access=False,
Created : ...
Bug B
--------- Comment ---------
- Name: b:1
+ Name: abc/b/...
From: ...
Date: ...
<BLANKLINE>
1 2
--------- Comment ---------
- Name: b:2
+ Name: abc/b/...
From: ...
Date: ...
<BLANKLINE>
1 2 3 4
--------- Comment ---------
- Name: b:3
+ Name: abc/b/...
From: ...
Date: ...
<BLANKLINE>
- Merged into bug a
+ Merged into bug #abc/a#
>>> print b.status
closed
>>> bd.cleanup()
"""
- parser = get_parser()
- options, args = parser.parse_args(args)
- cmdutil.default_complete(options, args, parser,
- bugid_args={0: lambda bug : bug.active==True,
- 1: lambda bug : bug.active==True})
+ name = 'merge'
- if len(args) < 2:
- raise cmdutil.UsageError("Please specify two bug ids.")
- if len(args) > 2:
- help()
- raise cmdutil.UsageError("Too many arguments.")
-
- bd = bugdir.BugDir(from_disk=True,
- manipulate_encodings=manipulate_encodings,
- root=dir)
- bugA = cmdutil.bug_from_id(bd, args[0])
- bugA.load_comments()
- bugB = cmdutil.bug_from_id(bd, args[1])
- bugB.load_comments()
- mergeA = bugA.new_comment("Merged from bug %s" % bugB.uuid)
- newCommTree = copy.deepcopy(bugB.comment_root)
- for comment in newCommTree.traverse(): # all descendant comments
- comment.bug = bugA
- comment.save() # force onto disk under bugA
- for comment in newCommTree: # just the child comments
- mergeA.add_reply(comment, allow_time_inversion=True)
- bugB.new_comment("Merged into bug %s" % bugA.uuid)
- bugB.status = "closed"
- print "Merging bugs %s and %s" % (bugA.uuid, bugB.uuid)
+ def __init__(self, *args, **kwargs):
+ libbe.command.Command.__init__(self, *args, **kwargs)
+ self.requires_bugdir = True
+ self.args.extend([
+ libbe.command.Argument(
+ name='bug-id', metavar='BUG-ID', default=None,
+ completion_callback=libbe.command.util.complete_bug_id),
+ libbe.command.Argument(
+ name='bug-id-to-merge', metavar='BUG-ID', default=None,
+ completion_callback=libbe.command.util.complete_bug_id),
+ ])
-def get_parser():
- parser = cmdutil.CmdOptionParser("be merge BUG-ID BUG-ID")
- return parser
+ def _run(self, storage, bugdir, **params):
+ bugA,dummy_comment = \
+ libbe.command.util.bug_comment_from_user_id(
+ bugdir, params['bug-id'])
+ bugA.load_comments()
+ bugB,dummy_comment = \
+ libbe.command.util.bug_comment_from_user_id(
+ bugdir, params['bug-id-to-merge'])
+ bugB.load_comments()
+ mergeA = bugA.new_comment('Merged from bug #%s#' % bugB.id.long_user())
+ newCommTree = copy.deepcopy(bugB.comment_root)
+ for comment in newCommTree.traverse(): # all descendant comments
+ comment.bug = bugA
+ # uuids must be unique in storage
+ if comment.alt_id == None:
+ comment.storage = None
+ comment.alt_id = comment.uuid
+ comment.storage = storage
+ comment.uuid = libbe.util.id.uuid_gen()
+ comment.save() # force onto disk under bugA
-longhelp="""
+ for comment in newCommTree: # just the child comments
+ mergeA.add_reply(comment, allow_time_inversion=True)
+ bugB.new_comment('Merged into bug #%s#' % bugA.id.long_user())
+ bugB.status = 'closed'
+ print >> self.stdout, 'Merged bugs #%s# and #%s#' \
+ % (bugA.id.user(), bugB.id.user())
+ return 0
+
+ def _long_help(self):
+ return """
The second bug (B) is merged into the first (A). This adds merge
comments to both bugs, closes B, and appends B's comment tree to A's
merge comment.
"""
-
-def help():
- return get_parser().help_str() + longhelp