]> git.openstreetmap.org Git - rails.git/blobdiff - app/models/relation.rb
Merge remote-tracking branch 'openstreetmap/pull/1437'
[rails.git] / app / models / relation.rb
index 062f0ed04ec073a869ecabfd3f5414e95e940c6d..b78c95ce4ddc9f9c0c9f99b61a6a683ed627c67c 100644 (file)
@@ -36,7 +36,7 @@ class Relation < ActiveRecord::Base
   TYPES = %w(node way relation).freeze
 
   def self.from_xml(xml, create = false)
-    p = XML::Parser.string(xml)
+    p = XML::Parser.string(xml, :options => XML::Parser::Options::NOERROR)
     doc = p.parse
 
     doc.find("//osm/relation").each do |pt|
@@ -60,7 +60,7 @@ class Relation < ActiveRecord::Base
       relation.id = pt["id"].to_i
       # .to_i will return 0 if there is no number that can be parsed.
       # We want to make sure that there is no id with zero anyway
-      raise OSM::APIBadUserInput.new("ID of relation cannot be zero when updating.") if relation.id == 0
+      raise OSM::APIBadUserInput.new("ID of relation cannot be zero when updating.") if relation.id.zero?
     end
 
     # We don't care about the timestamp nor the visibility as these are either
@@ -281,15 +281,19 @@ class Relation < ActiveRecord::Base
   private
 
   def save_with_history!
+    t = Time.now.getutc
+
+    self.version += 1
+    self.timestamp = t
+
     Relation.transaction do
       # have to be a little bit clever here - to detect if any tags
       # changed then we have to monitor their before and after state.
       tags_changed = false
 
-      t = Time.now.getutc
-      self.version += 1
-      self.timestamp = t
-      save!
+      # clone the object before saving it so that the original is
+      # still marked as dirty if we retry the transaction
+      clone.save!
 
       tags = self.tags.clone
       relation_tags.each do |old_tag|
@@ -370,7 +374,7 @@ class Relation < ActiveRecord::Base
       # materially change the rest of the relation.
       any_relations =
         changed_members.collect { |_id, type| type == "relation" }
-                       .inject(false) { |a, e| a || e }
+                       .inject(false) { |acc, elem| acc || elem }
 
       update_members = if tags_changed || any_relations
                          # add all non-relation bounding boxes to the changeset