aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libbe/bug.py11
-rw-r--r--libbe/command/import_xml.py6
-rw-r--r--libbe/comment.py8
3 files changed, 18 insertions, 7 deletions
diff --git a/libbe/bug.py b/libbe/bug.py
index adccf21..bbe6980 100644
--- a/libbe/bug.py
+++ b/libbe/bug.py
@@ -337,7 +337,7 @@ class Bug (settings_object.SavedSettingsObject):
sep = '\n' + istring
return istring + sep.join(lines).rstrip('\n')
- def from_xml(self, xml_string, verbose=True):
+ def from_xml(self, xml_string, preserve_uuids=False, verbose=True):
u"""
Note: If a bug uuid is given, set .alt_id to it's value.
>>> bugA = Bug(uuid="0123", summary="Need to test Bug.from_xml()")
@@ -362,6 +362,10 @@ class Bug (settings_object.SavedSettingsObject):
['severity', 'status', 'creator', 'time', 'summary']
>>> len(list(bugB.comments()))
3
+ >>> bugC = Bug()
+ >>> bugC.from_xml(xml, preserve_uuids=True)
+ >>> bugC.uuid == bugA.uuid
+ True
"""
if type(xml_string) == types.UnicodeType:
xml_string = xml_string.strip().encode('unicode_escape')
@@ -383,7 +387,8 @@ class Bug (settings_object.SavedSettingsObject):
pass
elif child.tag == 'comment':
comm = comment.Comment(bug=self)
- comm.from_xml(child)
+ comm.from_xml(
+ child, preserve_uuids=preserve_uuids, verbose=verbose)
comments.append(comm)
continue
elif child.tag in tags:
@@ -392,7 +397,7 @@ class Bug (settings_object.SavedSettingsObject):
else:
text = xml.sax.saxutils.unescape(child.text)
text = text.decode('unicode_escape').strip()
- if child.tag == 'uuid':
+ if child.tag == 'uuid' and not preserve_uuids:
uuid = text
continue # don't set the bug's uuid tag.
elif child.tag == 'created':
diff --git a/libbe/command/import_xml.py b/libbe/command/import_xml.py
index b4da2fd..44205cb 100644
--- a/libbe/command/import_xml.py
+++ b/libbe/command/import_xml.py
@@ -76,6 +76,8 @@ class Import_XML (libbe.command.Command):
help="If any comment's <in-reply-to> refers to a non-existent comment, ignore it (instead of raising an exception)."),
libbe.command.Option(name='add-only', short_name='a',
help='If any bug or comment listed in the XML file already exists in the bug repository, do not alter the repository version.'),
+ libbe.command.Option(name='preserve-uuids', short_name='p',
+ help='Preserve UUIDs for trusted input (potential name collisions).'),
libbe.command.Option(name='comment-root', short_name='c',
help='Supply a bug or comment ID as the root of any <comment> elements that are direct children of the <be-xml> element. If any such <comment> elements exist, you are required to set this option.',
arg=libbe.command.Argument(
@@ -131,11 +133,11 @@ class Import_XML (libbe.command.Command):
for child in be_xml.getchildren():
if child.tag == 'bug':
new = libbe.bug.Bug(bugdir=bugdir)
- new.from_xml(child)
+ new.from_xml(child, preserve_uuids=params['preserve-uuids'])
root_bugs.append(new)
elif child.tag == 'comment':
new = libbe.comment.Comment(croot_bug)
- new.from_xml(child)
+ new.from_xml(child, preserve_uuids=params['preserve-uuids'])
root_comments.append(new)
elif child.tag == 'version':
for gchild in child.getchildren():
diff --git a/libbe/comment.py b/libbe/comment.py
index 6350e2c..8ffb3cd 100644
--- a/libbe/comment.py
+++ b/libbe/comment.py
@@ -340,7 +340,7 @@ class Comment (Tree, settings_object.SavedSettingsObject):
sep = '\n' + istring
return istring + sep.join(lines).rstrip('\n')
- def from_xml(self, xml_string, verbose=True):
+ def from_xml(self, xml_string, preserve_uuids=False, verbose=True):
u"""
Note: If alt-id is not given, translates any <uuid> fields to
<alt-id> fields.
@@ -360,6 +360,10 @@ class Comment (Tree, settings_object.SavedSettingsObject):
>>> commB.alt_id = None
>>> commB.xml() == xml
True
+ >>> commC = Comment()
+ >>> commC.from_xml(xml, preserve_uuids=True)
+ >>> commC.uuid == commA.uuid
+ True
"""
if type(xml_string) == types.UnicodeType:
xml_string = xml_string.strip().encode('unicode_escape')
@@ -385,7 +389,7 @@ class Comment (Tree, settings_object.SavedSettingsObject):
else:
text = xml.sax.saxutils.unescape(child.text)
text = text.decode('unicode_escape').strip()
- if child.tag == 'uuid':
+ if child.tag == 'uuid' and not preserve_uuids:
uuid = text
continue # don't set the comment's uuid tag.
elif child.tag == 'body':