From b5c4896d7ffd219a3118a3e6885db5956bf79e55 Mon Sep 17 00:00:00 2001 From: "W. Trevor King" Date: Sun, 12 Jul 2009 14:32:55 -0400 Subject: [PATCH] Added "be comment --xml --ignore-missing-references ID COMMENT". Now you don't have to edit them out by hand. --- becommands/comment.py | 9 ++++++++- libbe/cmdutil.py | 3 ++- libbe/comment.py | 24 +++++++++++++++++++++--- 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/becommands/comment.py b/becommands/comment.py index 9a1e2ec..da82854 100644 --- a/becommands/comment.py +++ b/becommands/comment.py @@ -144,7 +144,11 @@ def execute(args, test=False): else: print >> sys.stderr, "Ignoring unknown tag %s in %s" \ % (child.tag, comment_list.tag) - comment.list_to_root(new_comments,bug,root=parent) # link new comments + try: + comment.list_to_root(new_comments,bug,root=parent, # link new comments + ignore_missing_references=options.ignore_missing_references) + except comment.MissingReference, e: + raise cmdutil.UserError(e) # Protect against programmer error causing data loss: kids = [c.uuid for c in parent.traverse()] for nc in new_comments: @@ -157,6 +161,9 @@ def get_parser(): help="Set comment content-type (e.g. text/plain)", default=None) parser.add_option("-x", "--xml", action="store_true", default=False, dest='XML', help="Use COMMENT to specify an XML comment description rather than the comment body. The root XML element should be either or with one or more children. The syntax for the elements should match that generated by 'be show --xml COMMENT-ID'. Unrecognized tags are ignored. Missing tags are left at the default value. The comment UUIDs are always auto-generated, so if you set a field, but no field, your will be used as the comment's . An exception is raised if conflicts with an existing comment.") + parser.add_option("-i", "--ignore-missing-references", action="store_true", + dest="ignore_missing_references", + help="For XML import, if any comment's refers to a non-existent comment, ignore it (instead of raising an exception).") return parser longhelp=""" diff --git a/libbe/cmdutil.py b/libbe/cmdutil.py index b39aa51..0bee9db 100644 --- a/libbe/cmdutil.py +++ b/libbe/cmdutil.py @@ -71,7 +71,8 @@ def get_command(command_name): def execute(cmd, args): enc = encoding.get_encoding() - get_command(cmd).execute([a.decode(enc) for a in args]) + cmd = get_command(cmd) + cmd.execute([a.decode(enc) for a in args]) return 0 def help(cmd=None): diff --git a/libbe/comment.py b/libbe/comment.py index a085741..68deaf3 100644 --- a/libbe/comment.py +++ b/libbe/comment.py @@ -20,6 +20,7 @@ import base64 import os import os.path +import sys import time import types try: # import core module, Python >= 2.5 @@ -54,9 +55,17 @@ class InvalidXML(ValueError): self.element = element self.comment = comment +class MissingReference(ValueError): + def __init__(self, comment): + msg = "Missing reference to %s" % (comment.in_reply_to) + ValueError.__init__(self, msg) + self.reference = comment.in_reply_to + self.comment = comment + INVALID_UUID = "!!~~\n INVALID-UUID \n~~!!" -def list_to_root(comments, bug, root=None): +def list_to_root(comments, bug, root=None, + ignore_missing_references=False): """ Convert a raw list of comments to single root comment. We use a dummy root comment by default, because there can be several @@ -88,8 +97,17 @@ def list_to_root(comments, bug, root=None): root_comments.append(comm) else: parentUUID = comm.in_reply_to - parent = uuid_map[parentUUID] - parent.add_reply(comm) + try: + parent = uuid_map[parentUUID] + parent.add_reply(comm) + except KeyError, e: + if ignore_missing_references == True: + print >> sys.stderr, \ + "Ignoring missing reference to %s" % parentUUID + comm.in_reply_to = None + root_comments.append(comm) + else: + raise MissingReference(comm) root.extend(root_comments) return root -- 2.26.2