Defect #882
closedmigrate_from_trac doesn't import timestamps of wiki and tickets
90%
Description
After importing a Trac project with Redmine r1270, I noticed that all imported wiki page history was timestamped with the current time. Also the tickets doesn't seem to have a start time set.
After a quick look into lib/tasks/import_from_trac.rake it looks like timestamps of wiki page edits aren't imported, although I can't explain why ticket timestamps fail to import.
Updated by Andreas Neuhaus over 16 years ago
- Status changed from New to Resolved
- Target version set to 0.7
- % Done changed from 0 to 90
I solved this problem in my case by overriding Time.now during the import. This ist more like a workaround and maybe it'd be more appropriate to disable the ActiveRecord timestamps at all during import and set created_on and updated_on attributes manually (but since I'm not very familiar with the Redmine models and the acts_as_versioned plugin, I had problems doing so and did this hack to be able to import my project into Redmine without losing the changelog timestamps)
I also added a comment and set the author to nil for the automatic page edit that is done for each completely imported page (where the wiki syntax of Trac is converted to Redmine)
Index: lib/tasks/migrate_from_trac.rake =================================================================== --- lib/tasks/migrate_from_trac.rake (revision 1291) +++ lib/tasks/migrate_from_trac.rake (working copy) @@ -69,6 +69,21 @@ 'developer' => developer_role } + class ::Time + class << self + alias :real_now :now + def now + real_now - @fake_diff.to_i + end + def fake (time) + @fake_diff = real_now - time + res = yield + @fake_diff = 0 + res + end + end + end + class TracComponent < ActiveRecord::Base set_table_name :component end @@ -345,14 +360,14 @@ i.tracker = TRACKER_MAPPING[ticket.ticket_type] || DEFAULT_TRACKER i.custom_values << CustomValue.new(:custom_field => custom_field_map['resolution'], :value => ticket.resolution) unless ticket.resolution.blank? i.id = ticket.id unless Issue.exists?(ticket.id) - next unless i.save + next unless Time.fake(ticket.time) { i.save } TICKET_MAP[ticket.id] = i.id migrated_tickets += 1 # Owner unless ticket.owner.blank? i.assigned_to = find_or_create_user(ticket.owner, true) - i.save + Time.fake(ticket.time) { i.save } end # Comments and status/resolution changes @@ -380,7 +395,7 @@ :old_value => resolution_change.oldvalue, :value => resolution_change.newvalue) end - n.save unless n.details.empty? && n.notes.blank? + Time.fake(time) { n.save } unless n.details.empty? && n.notes.blank? end # Attachments @@ -390,7 +405,7 @@ a.file = attachment a.author = find_or_create_user(attachment.author) a.container = i - migrated_ticket_attachments += 1 if a.save + migrated_ticket_attachments += 1 if Time.fake(attachment.time) { a.save } end # Custom fields @@ -426,7 +441,7 @@ p.content.text = page.text p.content.author = find_or_create_user(page.author) unless page.author.blank? || page.author == 'trac' p.content.comments = page.comment - p.new_record? ? p.save : p.content.save + Time.fake(page.time) { p.new_record? ? p.save : p.content.save } next if p.content.new_record? migrated_wiki_edits += 1 @@ -439,13 +454,15 @@ a.file = attachment a.author = find_or_create_user(attachment.author) a.container = p - migrated_wiki_attachments += 1 if a.save + migrated_wiki_attachments += 1 if Time.fake(attachment.time) { a.save } end end wiki.reload wiki.pages.each do |page| page.content.text = convert_wiki_text(page.content.text) + page.content.author = nil + page.content.comments = 'Migration to Redmine' page.content.save end end
Updated by Jean-Philippe Lang over 16 years ago
- Status changed from Resolved to Closed
- Resolution set to Fixed
Committed in r1302 with slight changes (eg. use ticket changetime instead of time since Time.fake is used to properly set updated_on properties).