From 5452747729d30733a51a85ff1212d0724af1d1ff Mon Sep 17 00:00:00 2001
From: James Lopez <james@jameslopez.es>
Date: Wed, 21 Dec 2016 10:33:20 +0100
Subject: [PATCH] Fix error importing label priorities and added relevant spec

---
 lib/gitlab/import_export/relation_factory.rb | 28 ++++++++++++++++----
 spec/lib/gitlab/import_export/project.json   | 22 +++++++++++++++
 2 files changed, 45 insertions(+), 5 deletions(-)

diff --git a/lib/gitlab/import_export/relation_factory.rb b/lib/gitlab/import_export/relation_factory.rb
index 65b229ca8ff..7a649f28340 100644
--- a/lib/gitlab/import_export/relation_factory.rb
+++ b/lib/gitlab/import_export/relation_factory.rb
@@ -22,7 +22,7 @@ module Gitlab
 
       IMPORTED_OBJECT_MAX_RETRIES = 5.freeze
 
-      EXISTING_OBJECT_CHECK = %i[milestone milestones label labels project_label project_labels project_label group_label].freeze
+      EXISTING_OBJECT_CHECK = %i[milestone milestones label labels project_label project_labels group_label group_labels].freeze
 
       def self.create(*args)
         new(*args).create
@@ -189,7 +189,7 @@ module Gitlab
         # Otherwise always create the record, skipping the extra SELECT clause.
         @existing_or_new_object ||= begin
           if EXISTING_OBJECT_CHECK.include?(@relation_name)
-            attribute_hash = attribute_hash_for(['events', 'priorities'])
+            attribute_hash = attribute_hash_for(['events'])
 
             existing_object.assign_attributes(attribute_hash) if attribute_hash.any?
 
@@ -210,9 +210,8 @@ module Gitlab
       def existing_object
         @existing_object ||=
           begin
-            finder_attributes = @relation_name == :group_label ? %w[title group_id] : %w[title project_id]
-            finder_hash = parsed_relation_hash.slice(*finder_attributes)
-            existing_object = relation_class.find_or_create_by(finder_hash)
+            existing_object = find_or_create_object!
+
             # Done in two steps, as MySQL behaves differently than PostgreSQL using
             # the +find_or_create_by+ method and does not return the ID the second time.
             existing_object.update!(parsed_relation_hash)
@@ -224,6 +223,25 @@ module Gitlab
         @relation_name == :services && parsed_relation_hash['type'] &&
           !Object.const_defined?(parsed_relation_hash['type'])
       end
+
+      def find_or_create_object!
+        finder_attributes = @relation_name == :group_label ? %w[title group_id] : %w[title project_id]
+        finder_hash = parsed_relation_hash.slice(*finder_attributes)
+
+        if label?
+          label = relation_class.find_or_initialize_by(finder_hash)
+          parsed_relation_hash.delete('priorities') if label.persisted?
+
+          label.save!
+          label
+        else
+          relation_class.find_or_create_by(finder_hash)
+        end
+      end
+
+      def label?
+        @relation_name.to_s.include?('label')
+      end
     end
   end
 end
diff --git a/spec/lib/gitlab/import_export/project.json b/spec/lib/gitlab/import_export/project.json
index 931d426c87f..2c0750c3377 100644
--- a/spec/lib/gitlab/import_export/project.json
+++ b/spec/lib/gitlab/import_export/project.json
@@ -15,6 +15,28 @@
       "type": "ProjectLabel",
       "priorities": [
       ]
+    },
+    {
+      "id": 3,
+      "title": "test3",
+      "color": "#428bca",
+      "group_id": 8,
+      "created_at": "2016-07-22T08:55:44.161Z",
+      "updated_at": "2016-07-22T08:55:44.161Z",
+      "template": false,
+      "description": "",
+      "project_id": null,
+      "type": "GroupLabel",
+      "priorities": [
+        {
+          "id": 1,
+          "project_id": 5,
+          "label_id": 1,
+          "priority": 1,
+          "created_at": "2016-10-18T09:35:43.338Z",
+          "updated_at": "2016-10-18T09:35:43.338Z"
+        }
+      ]
     }
   ],
   "issues": [
-- 
GitLab