Handle Branches from Launchpad in Migration

When migrating bugs from launchpad to StoryBoard, there is only
logic in place for master branches. If a bug exists on a branch
other than master, its added to master anyway. This patch gets the
branch info from the bug, checks that the branch exists in the project
and if it doesn't advises on creating the branch and exits. Otherwise
the bug is created.

This patch also cleans up other pep8 errors related to print
statements.

Change-Id: I0c1c8d3ebef80fd0937eaa343fdb26f7aadec67c
This commit is contained in:
Kendall Nelson 2017-02-23 09:55:26 -06:00
parent 1297093792
commit c7315825f3
3 changed files with 83 additions and 36 deletions

View File

@ -52,7 +52,7 @@ def main():
# requested one.
auto_increment = CONF.auto_increment
if auto_increment:
print 'Setting stories.AUTO_INCREMENT to %d' % (auto_increment,)
print('Setting stories.AUTO_INCREMENT to %d' % (auto_increment,))
session = db_api.get_session(in_request=False)
session.execute('ALTER TABLE stories AUTO_INCREMENT = %d;'
% (auto_increment,))
@ -61,5 +61,5 @@ def main():
loader = LaunchpadLoader(CONF.from_project, CONF.to_project)
loader.run()
else:
print 'Unsupported import origin: %s' % CONF.origin
print('Unsupported import origin: %s' % CONF.origin)
return

View File

@ -43,7 +43,25 @@ class LaunchpadLoader(object):
for message in bug.messages:
self.writer.write_user(message.owner)
# Write the bug.
links = [task.target_link for task in bug.bug_tasks]
releases = ['kilo', 'liberty', 'mitaka', 'newton', 'ocata',
'pike', 'queens']
branches = []
#Strip ugliness off of links to bugs
for branch in links:
split_branch = branch.split('launchpad.net')
url_parts = split_branch[1].split('/')
branch_name = url_parts[-1].lower()
project_name = url_parts[-2]
if (branch_name in releases and
project_name == self.reader.project_name):
branches.append(branch_name)
elif branch_name == self.reader.project_name:
branches.append('master')
# Write the bug
priority = map_lp_priority(lp_bug.importance)
status = map_lp_status(lp_bug.status)
self.writer.write_bug(bug=bug,
@ -51,7 +69,8 @@ class LaunchpadLoader(object):
assignee=assignee,
priority=priority,
status=status,
tags=tags)
tags=tags,
branches=branches)
def map_lp_priority(lp_priority):

View File

@ -52,16 +52,16 @@ class LaunchpadWriter(object):
.filter_by(name=project_name) \
.first()
if not self.project:
print "Local project %s not found in storyboard, please create " \
"it first." % (project_name)
print("Local project %s not found in storyboard, please create \
it first." % (project_name))
sys.exit(1)
self.branch = db_api.model_query(Branch, self.session) \
.filter_by(project_id=self.project.id, name='master') \
.first()
if not self.branch:
print "No master branch found for project %s, please create " \
"one first." % (project_name)
print("No master branch found for project %s, please create \
one first." % (project_name))
sys.exit(1)
def write_tags(self, bug):
@ -93,7 +93,7 @@ class LaunchpadWriter(object):
if not tag:
# Go ahead and create it.
print "Importing tag '%s'" % (tag_name)
print("Importing tag '%s'" % tag_name)
tag = db_api.entity_create(StoryTag, {
'name': tag_name
}, session=self.session)
@ -129,8 +129,8 @@ class LaunchpadWriter(object):
except DiscoveryFailure:
# If we encounter a launchpad maintenance user,
# give it an invalid openid.
print "WARNING: Invalid OpenID for user \'%s\'" \
% (display_name,)
print("WARNING: Invalid OpenID for user \'%s\'"
% (display_name,))
self._openid_map[user_link] = \
'http://example.com/invalid/~%s' % (display_name,)
@ -144,7 +144,7 @@ class LaunchpadWriter(object):
.filter_by(openid=openid) \
.first()
if not user:
print "Importing user '%s'" % (user_link)
print("Importing user '%s'" % (user_link))
# Use a temporary email address, since LP won't give this to
# us and it'll be updated on first login anyway.
@ -158,13 +158,39 @@ class LaunchpadWriter(object):
return self._user_map[openid]
def write_bug(self, owner, assignee, priority, status, tags, bug):
def check_branch(self, branch):
#Look in db for branches that are in project
#if branch is in project return True
exists = (db_api.model_query(Branch, self.session)
.filter_by(project_id=self.project.id)
.filter_by(name=branch).all())
return exists
def get_branch(self, branch):
result = (db_api.model_query(Branch, self.session)
.filter_by(project_id=self.project.id)
.filter_by(name=branch)
.first())
return result
def write_bug(self, owner, assignee, priority, status, tags, bug,
branches):
"""Writes the story, task, task history, and conversation.
:param owner: The bug owner SQLAlchemy entity.
:param tags: The tag SQLAlchemy entities.
:param bug: The Launchpad Bug record.
"""
#Checks to make sure that the branch for the bug exists
for branch in branches:
if not self.check_branch(branch):
print('No %s branch found for %s project. Creating one now.' %
(branch, self.project.name))
db_api.entity_create(Branch, {
'name': branch,
'project_id': self.project.id
}, session=self.session)
if hasattr(bug, 'date_created'):
created_at = bug.date_created
@ -180,9 +206,9 @@ class LaunchpadWriter(object):
# example url: https://api.launchpad.net/1.0/bugs/1057477
url_match = re.search("([0-9]+)$", str(bug.self_link))
if not url_match:
print 'ERROR: Unable to extract launchpad ID from %s.' \
% (bug.self_link,)
print 'ERROR: Please file a ticket.'
print('ERROR: Unable to extract launchpad ID from %s.'
% (bug.self_link,))
print('ERROR: Please file a ticket.')
return
launchpad_id = int(url_match.groups()[0])
@ -209,10 +235,10 @@ class LaunchpadWriter(object):
duplicate = db_api.entity_get(Story, launchpad_id,
session=self.session)
if not duplicate:
print "Importing Story: %s" % (bug.self_link,)
print("Importing Story: %s" % (bug.self_link,))
story = db_api.entity_create(Story, story, session=self.session)
else:
print "Existing Story: %s" % (bug.self_link,)
print("Existing Story: %s" % (bug.self_link,))
story = duplicate
# Duplicate check- launchpad import creates one task per story,
@ -224,20 +250,22 @@ class LaunchpadWriter(object):
.filter(Task.project_id == self.project.id) \
.first()
if not existing_task:
print "- Adding task in project %s" % (self.project.name,)
task = db_api.entity_create(Task, {
'title': title,
'assignee_id': assignee.id if assignee else None,
'project_id': self.project.id,
'branch_id': self.branch.id,
'story_id': launchpad_id,
'created_at': created_at,
'updated_at': updated_at,
'priority': priority,
'status': status
}, session=self.session)
print("- Adding task in project %s" % (self.project.name,))
for branch in branches:
task = db_api.entity_create(Task, {
'title': title,
'assignee_id': assignee.id if assignee else None,
'project_id': self.project.id,
'branch_id': self.get_branch(branch).id,
'story_id': launchpad_id,
'created_at': created_at,
'updated_at': updated_at,
'priority': priority,
'status': status
}, session=self.session)
else:
print "- Existing task in %s" % (self.project.name,)
print("- Existing task in %s" % (self.project.name,))
task = existing_task
# Duplication Check - If this story already has a creation event,
@ -249,7 +277,7 @@ class LaunchpadWriter(object):
.filter(TimeLineEvent.event_type == event_types.STORY_CREATED) \
.first()
if not story_created_event:
print "- Generating story creation event"
print("- Generating story creation event")
db_api.entity_create(TimeLineEvent, {
'story_id': launchpad_id,
'author_id': owner.id,
@ -260,7 +288,7 @@ class LaunchpadWriter(object):
# Create the creation event for the task, but only if we just created
# a new task.
if not existing_task:
print "- Generating task creation event"
print("- Generating task creation event")
db_api.entity_create(TimeLineEvent, {
'story_id': launchpad_id,
'author_id': owner.id,
@ -279,10 +307,10 @@ class LaunchpadWriter(object):
.filter(TimeLineEvent.event_type == event_types.USER_COMMENT) \
.count()
desired_count = len(bug.messages)
print "- %s of %s comments already imported." % (current_count,
desired_count)
print("- %s of %s comments already imported." % (current_count,
desired_count))
for i in range(current_count, desired_count):
print '- Importing comment %s of %s' % (i + 1, desired_count)
print('- Importing comment %s of %s' % (i + 1, desired_count))
message = bug.messages[i]
message_created_at = message.date_created
message_owner = self.write_user(message.owner)