diff --git a/lib/gitlab/bitbucket_import/importer.rb b/lib/gitlab/bitbucket_import/importer.rb index b6a0b122cdbdf0728f831cee22e2761e08af719f..567f2b314aa59d08e4bce72769a87668ed10b8e1 100644 --- a/lib/gitlab/bitbucket_import/importer.rb +++ b/lib/gitlab/bitbucket_import/importer.rb @@ -6,24 +6,34 @@ module Gitlab { title: 'proposal', color: '#69D100' }, { title: 'task', color: '#7F8C8D' }].freeze - attr_reader :project, :client + attr_reader :project, :client, :errors def initialize(project) @project = project @client = Bitbucket::Client.new(project.import_data.credentials) @formatter = Gitlab::ImportFormatter.new @labels = {} + @errors = [] end def execute import_issues import_pull_requests + handle_errors true end private + def handle_errors + return unless errors.any? + project.update_column(:import_error, { + message: 'The remote data could not be fully imported.', + errors: errors + }.to_json) + end + def gitlab_user_id(project, username) if username user = find_user(username) @@ -51,21 +61,25 @@ module Gitlab create_labels client.issues(repo).each do |issue| - description = '' - description += @formatter.author_line(issue.author) unless existing_gitlab_user?(issue.author) - description += issue.description - - label_name = issue.kind - - issue = project.issues.create( - iid: issue.iid, - title: issue.title, - description: description, - state: issue.state, - author_id: gitlab_user_id(project, issue.author), - created_at: issue.created_at, - updated_at: issue.updated_at - ) + begin + description = '' + description += @formatter.author_line(issue.author) unless existing_gitlab_user?(issue.author) + description += issue.description + + label_name = issue.kind + + issue = project.issues.create!( + iid: issue.iid, + title: issue.title, + description: description, + state: issue.state, + author_id: gitlab_user_id(project, issue.author), + created_at: issue.created_at, + updated_at: issue.updated_at + ) + rescue StandardError => e + errors << { type: :issue, iid: issue.iid, errors: e.message } + end issue.labels << @labels[label_name] @@ -82,18 +96,20 @@ module Gitlab note += @formatter.author_line(comment.author) unless existing_gitlab_user?(comment.author) note += comment.note - issue.notes.create!( - project: project, - note: note, - author_id: gitlab_user_id(project, comment.author), - created_at: comment.created_at, - updated_at: comment.updated_at - ) + begin + issue.notes.create!( + project: project, + note: note, + author_id: gitlab_user_id(project, comment.author), + created_at: comment.created_at, + updated_at: comment.updated_at + ) + rescue StandardError => e + errors << { type: :issue_comment, iid: issue.iid, errors: e.message } + end end end end - rescue ActiveRecord::RecordInvalid => e - Rails.logger.error("Bitbucket importer ERROR in #{project.path_with_namespace}: Couldn't import record properly #{e.message}") end def create_labels @@ -129,8 +145,8 @@ module Gitlab ) import_pull_request_comments(pull_request, merge_request) if merge_request.persisted? - rescue ActiveRecord::RecordInvalid - Rails.logger.error("Bitbucket importer ERROR in #{project.path_with_namespace}: Invalid pull request #{e.message}") + rescue StandardError => e + errors << { type: :pull_request, iid: pull_request.iid, errors: e.message } end end end @@ -169,9 +185,8 @@ module Gitlab type: 'DiffNote') merge_request.notes.create!(attributes) - rescue ActiveRecord::RecordInvalid => e - Rails.logger.error("Bitbucket importer ERROR in #{project.path_with_namespace}: Invalid pull request comment #{e.message}") - nil + rescue StandardError => e + errors << { type: :pull_request, iid: comment.iid, errors: e.message } end end end @@ -192,9 +207,8 @@ module Gitlab pr_comments.each do |comment| begin merge_request.notes.create!(pull_request_comment_attributes(comment)) - rescue ActiveRecord::RecordInvalid => e - Rails.logger.error("Bitbucket importer ERROR in #{project.path_with_namespace}: Invalid standalone pull request comment #{e.message}") - nil + rescue StandardError => e + errors << { type: :pull_request, iid: comment.iid, errors: e.message } end end end