From 67ffda97bdeb0a70c21f848a281e393122ff5a40 Mon Sep 17 00:00:00 2001 From: Jan Schulz-Hofen Date: Wed, 6 Jul 2011 17:56:29 +0200 Subject: [PATCH 1/7] adding outputs - work in progress --- app/models/redmine_merge.rb | 11 +++++++++++ app/models/source_issue.rb | 9 ++++++++- app/models/source_project.rb | 38 ++++++++++++++++++++---------------- lib/tasks/merge_redmine.rake | 1 + 4 files changed, 41 insertions(+), 18 deletions(-) diff --git a/app/models/redmine_merge.rb b/app/models/redmine_merge.rb index 72a2dda..1d656e6 100644 --- a/app/models/redmine_merge.rb +++ b/app/models/redmine_merge.rb @@ -1,17 +1,28 @@ class RedmineMerge def self.migrate + puts 'Migrating users...' SourceUser.migrate + puts 'Migrating custom fields...' SourceCustomField.migrate + puts 'Migrating trackers...' SourceTracker.migrate + puts 'Migrating issue status...' SourceIssueStatus.migrate + puts 'Migrating issue priorities...' SourceEnumeration.migrate_issue_priorities + puts 'Migrating time entry activities...' SourceEnumeration.migrate_time_entry_activities + puts 'Migrating document categories...' SourceEnumeration.migrate_document_categories # Project-specific data + puts 'Migrating projects...' SourceProject.migrate + puts 'Migrating versions...' SourceVersion.migrate + puts 'Migrating news...' SourceNews.migrate + puts 'Migrating issue categories...' SourceIssueCategory.migrate SourceIssue.migrate SourceIssueRelation.migrate diff --git a/app/models/source_issue.rb b/app/models/source_issue.rb index 779969f..20a0fee 100644 --- a/app/models/source_issue.rb +++ b/app/models/source_issue.rb @@ -12,15 +12,22 @@ class SourceIssue < ActiveRecord::Base def self.migrate all.each do |source_issue| - + puts "- Migrating Issue ##{source_issue.id}: #{source_issue.subject}" issue = Issue.create!(source_issue.attributes) do |i| i.project = Project.find_by_name(source_issue.project.name) + puts "-- Set project #{i.project.name}" i.author = User.find_by_login(source_issue.author.login) + puts "-- Set author #{i.author}" i.assigned_to = User.find_by_login(source_issue.assigned_to.login) if source_issue.assigned_to + puts "-- Set assignee #{i.assigned_to}" i.status = IssueStatus.find_by_name(source_issue.status.name) + puts "-- Set issue status #{i.status}" i.tracker = Tracker.find_by_name(source_issue.tracker.name) + puts "-- Set tracker #{i.tracker}" i.priority = IssuePriority.find_by_name(source_issue.priority.name) + puts "-- Set issue priority #{i.priority}" i.category = IssueCategory.find_by_name(source_issue.category.name) if source_issue.category + puts "-- Set category #{i.category}" end RedmineMerge::Mapper.add_issue(source_issue.id, issue.id) diff --git a/app/models/source_project.rb b/app/models/source_project.rb index 6fbe1bc..c1b2cf5 100644 --- a/app/models/source_project.rb +++ b/app/models/source_project.rb @@ -7,27 +7,31 @@ class SourceProject < ActiveRecord::Base def self.migrate all(:order => 'lft ASC').each do |source_project| - next if Project.find_by_name(source_project.name) - next if Project.find_by_identifier(source_project.identifier) - - project = Project.create!(source_project.attributes) do |p| - p.status = source_project.status - if source_project.enabled_modules - p.enabled_module_names = source_project.enabled_modules.collect(&:name) - end + puts "- Migrating source project #{source_project.name}..." + if project = (Project.find_by_name(source_project.name) || Project.find_by_identifier(source_project.identifier)) + puts "-- Found" + else + project = Project.create!(source_project.attributes) do |p| + p.status = source_project.status + if source_project.enabled_modules + p.enabled_module_names = source_project.enabled_modules.collect(&:name) + end - if source_project.trackers - source_project.trackers.each do |source_tracker| - merged_tracker = Tracker.find_by_name(source_tracker.name) - p.trackers << merged_tracker if merged_tracker + if source_project.trackers + source_project.trackers.each do |source_tracker| + merged_tracker = Tracker.find_by_name(source_tracker.name) + p.trackers << merged_tracker if merged_tracker and not p.trackers.include?(merged_tracker) + end end end + + # Parent/child projects + if source_project.parent_id + project.set_parent!(Project.find_by_id(RedmineMerge::Mapper.get_new_project_id(source_project.parent_id))) + end + puts "-- Not found, created" end - - # Parent/child projects - if source_project.parent_id - project.set_parent!(Project.find_by_id(RedmineMerge::Mapper.get_new_project_id(source_project.parent_id))) - end + puts "-- Added to map" RedmineMerge::Mapper.add_project(source_project.id, project.id) end end diff --git a/lib/tasks/merge_redmine.rake b/lib/tasks/merge_redmine.rake index 7c08c0e..5108374 100644 --- a/lib/tasks/merge_redmine.rake +++ b/lib/tasks/merge_redmine.rake @@ -28,6 +28,7 @@ namespace :redmine do desc 'Merge two Redmine databases' task :merge_redmine => :environment do + Thread.current[:planio_account] = ENV['planio_account'] RedmineMerge.migrate end end From 6e7a7dbc9b5e6663e5d03323501e46603a92352a Mon Sep 17 00:00:00 2001 From: Jan Schulz-Hofen Date: Thu, 7 Jul 2011 03:07:01 +0200 Subject: [PATCH 2/7] add more verbosity --- app/models/redmine_merge.rb | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/models/redmine_merge.rb b/app/models/redmine_merge.rb index 1d656e6..d0389e6 100644 --- a/app/models/redmine_merge.rb +++ b/app/models/redmine_merge.rb @@ -24,15 +24,25 @@ def self.migrate SourceNews.migrate puts 'Migrating issue categories...' SourceIssueCategory.migrate + puts 'Migrating issues...' SourceIssue.migrate + puts 'Migrating issue relations...' SourceIssueRelation.migrate + puts 'Migrating journals...' SourceJournal.migrate + puts 'Migrating journal details...' SourceJournalDetail.migrate + puts 'Migrating time entries...' SourceTimeEntry.migrate + puts 'Migrating documents...' SourceDocument.migrate + puts 'Migrating wikis...' SourceWiki.migrate + puts 'Migrating wiki pages...' SourceWikiPage.migrate + puts 'Migrating wiki contents...' SourceWikiContent.migrate + puts 'Migrating attachments...' SourceAttachment.migrate end From 073fb24ef14d70b8584f52babd4a8bdeb0643b68 Mon Sep 17 00:00:00 2001 From: Jan Schulz-Hofen Date: Thu, 7 Jul 2011 03:07:09 +0200 Subject: [PATCH 3/7] fix typo in comment --- app/models/source_journal_detail.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/source_journal_detail.rb b/app/models/source_journal_detail.rb index 19e9210..be444a9 100644 --- a/app/models/source_journal_detail.rb +++ b/app/models/source_journal_detail.rb @@ -10,7 +10,7 @@ def self.migrate JournalDetail.create!(source_journal_detail.attributes) do |jd| jd.journal = Journal.find(RedmineMerge::Mapper.get_new_journal_id(source_journal_detail.journal_id)) - # Need to remap propery keys to their new ids + # Need to remap property keys to their new ids if source_journal_detail.prop_key.include?('_id') property_name = source_journal_detail.prop_key.to_s.gsub(/\_id$/, "").to_sym association = Issue.reflect_on_all_associations.detect {|a| a.name == property_name } From 8998ebb54075a16b09546847c36ab5975c52ca1f Mon Sep 17 00:00:00 2001 From: Jan Schulz-Hofen Date: Thu, 7 Jul 2011 03:08:25 +0200 Subject: [PATCH 4/7] fix cases where versions aren't assignable anymore (i.e. closed) --- app/models/source_issue.rb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/models/source_issue.rb b/app/models/source_issue.rb index 20a0fee..ffb7ef2 100644 --- a/app/models/source_issue.rb +++ b/app/models/source_issue.rb @@ -9,6 +9,7 @@ class SourceIssue < ActiveRecord::Base belongs_to :project, :class_name => 'SourceProject', :foreign_key => 'project_id' belongs_to :priority, :class_name => 'SourceEnumeration', :foreign_key => 'priority_id' belongs_to :category, :class_name => 'SourceIssueCategory', :foreign_key => 'category_id' + belongs_to :fixed_version, :class_name => 'SourceVersion', :foreign_key => 'fixed_version_id' def self.migrate all.each do |source_issue| @@ -28,6 +29,10 @@ def self.migrate puts "-- Set issue priority #{i.priority}" i.category = IssueCategory.find_by_name(source_issue.category.name) if source_issue.category puts "-- Set category #{i.category}" + if source_issue.fixed_version and version = Version.find(RedmineMerge::Mapper.get_new_version_id(source_issue.fixed_version.id)) + i.instance_variable_set :@assignable_versions, [version] + i.fixed_version = version + end end RedmineMerge::Mapper.add_issue(source_issue.id, issue.id) From 0e444dadc5543c94090054e2692d62ff5f4b5f8c Mon Sep 17 00:00:00 2001 From: Jan Schulz-Hofen Date: Thu, 7 Jul 2011 03:08:41 +0200 Subject: [PATCH 5/7] add even more verbosity --- app/models/source_issue.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/models/source_issue.rb b/app/models/source_issue.rb index ffb7ef2..e3e8ed7 100644 --- a/app/models/source_issue.rb +++ b/app/models/source_issue.rb @@ -13,7 +13,7 @@ class SourceIssue < ActiveRecord::Base def self.migrate all.each do |source_issue| - puts "- Migrating Issue ##{source_issue.id}: #{source_issue.subject}" + puts "- Migrating issue ##{source_issue.id}: #{source_issue.subject}" issue = Issue.create!(source_issue.attributes) do |i| i.project = Project.find_by_name(source_issue.project.name) puts "-- Set project #{i.project.name}" @@ -32,6 +32,7 @@ def self.migrate if source_issue.fixed_version and version = Version.find(RedmineMerge::Mapper.get_new_version_id(source_issue.fixed_version.id)) i.instance_variable_set :@assignable_versions, [version] i.fixed_version = version + puts "-- Set fixed version #{i.fixed_version}" end end From 3806f03047be5a9e445b7bd60c169152efe80e40 Mon Sep 17 00:00:00 2001 From: Jan Schulz-Hofen Date: Thu, 7 Jul 2011 16:37:12 +0200 Subject: [PATCH 6/7] use user map everywhere --- app/models/redmine_merge.rb | 9 +++++++++ app/models/source_attachment.rb | 2 +- app/models/source_issue.rb | 4 ++-- app/models/source_journal.rb | 1 + app/models/source_news.rb | 2 +- app/models/source_time_entry.rb | 2 +- app/models/source_user.rb | 23 +++++++++++++++-------- app/models/source_wiki_content.rb | 2 +- 8 files changed, 31 insertions(+), 14 deletions(-) diff --git a/app/models/redmine_merge.rb b/app/models/redmine_merge.rb index d0389e6..915163c 100644 --- a/app/models/redmine_merge.rb +++ b/app/models/redmine_merge.rb @@ -47,6 +47,7 @@ def self.migrate end class Mapper + Users = {} Projects = {} Issues = {} Journals = {} @@ -55,6 +56,14 @@ class Mapper Documents = {} Versions = {} + def self.add_user(source_id, new_id) + Users[source_id] = new_id + end + + def self.get_new_user_id(source_id) + Users[source_id] + end + def self.add_project(source_id, new_id) Projects[source_id] = new_id end diff --git a/app/models/source_attachment.rb b/app/models/source_attachment.rb index 07ea91d..83b8e87 100644 --- a/app/models/source_attachment.rb +++ b/app/models/source_attachment.rb @@ -8,7 +8,7 @@ def self.migrate all.each do |source_attachment| Attachment.create!(source_attachment.attributes) do |a| - a.author = User.find_by_login(source_attachment.author.login) + a.author = User.find(RedmineMerge::Mapper.get_new_user_id(source_attachment.author.id)) a.container = case source_attachment.container_type when "Issue" Issue.find RedmineMerge::Mapper.get_new_issue_id(source_attachment.container_id) diff --git a/app/models/source_issue.rb b/app/models/source_issue.rb index e3e8ed7..3f95469 100644 --- a/app/models/source_issue.rb +++ b/app/models/source_issue.rb @@ -17,9 +17,9 @@ def self.migrate issue = Issue.create!(source_issue.attributes) do |i| i.project = Project.find_by_name(source_issue.project.name) puts "-- Set project #{i.project.name}" - i.author = User.find_by_login(source_issue.author.login) + i.author = User.find(RedmineMerge::Mapper.get_new_user_id(source_issue.author.id)) puts "-- Set author #{i.author}" - i.assigned_to = User.find_by_login(source_issue.assigned_to.login) if source_issue.assigned_to + i.assigned_to = User.find(RedmineMerge::Mapper.get_new_user_id(source_issue.assigned_to.id)) if source_issue.assigned_to puts "-- Set assignee #{i.assigned_to}" i.status = IssueStatus.find_by_name(source_issue.status.name) puts "-- Set issue status #{i.status}" diff --git a/app/models/source_journal.rb b/app/models/source_journal.rb index 7d78552..6d4a0f3 100644 --- a/app/models/source_journal.rb +++ b/app/models/source_journal.rb @@ -10,6 +10,7 @@ def self.migrate journal = Journal.create!(source_journals.attributes) do |j| j.issue = Issue.find_by_subject(source_journals.issue.subject) + j.user = User.find(RedmineMerge::Mapper.get_new_user_id(source_journals.user_id)) end RedmineMerge::Mapper.add_journal(source_journals.id, journal.id) diff --git a/app/models/source_news.rb b/app/models/source_news.rb index 5b581b5..5f6706b 100644 --- a/app/models/source_news.rb +++ b/app/models/source_news.rb @@ -8,7 +8,7 @@ def self.migrate all.each do |source_news| News.create!(source_news.attributes) do |n| n.project = Project.find(RedmineMerge::Mapper.get_new_project_id(source_news.project_id)) - n.author = User.find_by_login(source_news.author.login) + n.author = User.find(RedmineMerge::Mapper.get_new_user_id(source_news.author.id)) end end end diff --git a/app/models/source_time_entry.rb b/app/models/source_time_entry.rb index cd43d9d..7f5b355 100644 --- a/app/models/source_time_entry.rb +++ b/app/models/source_time_entry.rb @@ -11,7 +11,7 @@ class SourceTimeEntry < ActiveRecord::Base def self.migrate all.each do |source_time_entry| TimeEntry.create!(source_time_entry.attributes) do |te| - te.user = User.find_by_login(source_time_entry.user.login) + te.user = User.find(RedmineMerge::Mapper.get_new_user_id(source_time_entry.user.id)) te.project = Project.find_by_name(source_time_entry.project.name) te.activity = TimeEntryActivity.find_by_name(source_time_entry.activity.name) diff --git a/app/models/source_user.rb b/app/models/source_user.rb index a305489..e9e58da 100644 --- a/app/models/source_user.rb +++ b/app/models/source_user.rb @@ -4,15 +4,22 @@ class SourceUser < ActiveRecord::Base def self.migrate all.each do |source_user| - next if User.find_by_mail(source_user.mail) - next if User.find_by_login(source_user.login) - next if source_user.type == "AnonymousUser" - - User.create!(source_user.attributes) do |u| - u.login = source_user.login - u.admin = source_user.admin - u.hashed_password = source_user.hashed_password + puts "- Migrating user #{source_user}..." + if source_user.type == "AnonymousUser" + user = User.anonymous + puts "-- Found" + elsif user = (User.find_by_mail(source_user.mail) || User.find_by_login(source_user.login)) + puts "-- Found" + else + user = User.create!(source_user.attributes) do |u| + u.login = source_user.login + u.admin = source_user.admin + u.hashed_password = source_user.hashed_password + end + puts "-- Not found, created" end + puts "-- Added to map" + RedmineMerge::Mapper.add_user(source_user.id, user.id) end end end diff --git a/app/models/source_wiki_content.rb b/app/models/source_wiki_content.rb index e4ab475..97b1c33 100644 --- a/app/models/source_wiki_content.rb +++ b/app/models/source_wiki_content.rb @@ -9,7 +9,7 @@ def self.migrate WikiContent.create!(source_wiki_content.attributes) do |wc| wc.page = WikiPage.find(RedmineMerge::Mapper.get_new_wiki_page_id(source_wiki_content.page_id)) - wc.author = User.find_by_login(source_wiki_content.author.login) + wc.author = User.find(RedmineMerge::Mapper.get_new_user_id(source_wiki_content.author.id)) end end end From 985234e91dd2099490af16507b553b82656d4176 Mon Sep 17 00:00:00 2001 From: Jan Schulz-Hofen Date: Sat, 16 Jul 2011 14:32:50 +0200 Subject: [PATCH 7/7] adding debug output to wiki import --- app/models/source_wiki.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/source_wiki.rb b/app/models/source_wiki.rb index ed4f09f..8a7ec43 100644 --- a/app/models/source_wiki.rb +++ b/app/models/source_wiki.rb @@ -4,7 +4,7 @@ class SourceWiki < ActiveRecord::Base def self.migrate all.each do |source_wiki| - + puts "- Migrating source wiki ID: #{source_wiki.id}..." project = Project.find(RedmineMerge::Mapper.get_new_project_id(source_wiki.project_id)) wiki = Wiki.create!(source_wiki.attributes) do |w|