Ticket #19783: 19783.patch

File 19783.patch, 3.5 KB (added by GerdP, 5 years ago)

use newer version when both are deleted

  • src/org/openstreetmap/josm/data/osm/DataSetMerger.java

     
    297297        // found a corresponding target, remember it
    298298        mergedMap.put(source.getPrimitiveId(), target.getPrimitiveId());
    299299
     300        boolean mergeFromSource = false;
    300301        if (target.getVersion() > source.getVersion())
    301302            // target.version > source.version => keep target version
    302303            return true;
     
    305306            // target is incomplete, source completes it
    306307            // => merge source into target
    307308            //
    308             target.mergeFrom(source);
    309             objectsWithChildrenToMerge.add(source.getPrimitiveId());
     309            mergeFromSource = true;
    310310        } else if (!target.isIncomplete() && source.isIncomplete()) {
    311311            // target is complete and source is incomplete
    312312            // => keep target, it has more information already
     
    323323            // We shouldn't merge that datasets.
    324324            throw new DataIntegrityProblemException(tr("Conflict in ''visible'' attribute for object of type {0} with id {1}",
    325325                    target.getType(), target.getId()));
     326        } else if (target.isDeleted() && source.isDeleted() && target.getVersion() < source.getVersion()) {
     327            // both deleted. Source is newer. Take source. See #19783
     328            mergeFromSource = true;
    326329        } else if (target.isDeleted() && !source.isDeleted() && target.getVersion() == source.getVersion()) {
    327330            // same version, but target is deleted. Assume target takes precedence
    328331            // otherwise too many conflicts when refreshing from the server
     
    347350        } else if (!target.isModified() && source.isModified()) {
    348351            // target not modified. We can assume that source is the most recent version.
    349352            // clone it into target.
    350             target.mergeFrom(source);
    351             objectsWithChildrenToMerge.add(source.getPrimitiveId());
     353            mergeFromSource = true;
    352354        } else if (!target.isModified() && !source.isModified() && target.getVersion() == source.getVersion()) {
    353355            // both not modified. Merge nevertheless.
    354356            // This helps when updating "empty" relations, see #4295
    355             target.mergeFrom(source);
    356             objectsWithChildrenToMerge.add(source.getPrimitiveId());
     357            mergeFromSource = true;
    357358        } else if (!target.isModified() && !source.isModified() && target.getVersion() < source.getVersion()) {
    358359            // my not modified but other is newer. clone other onto mine.
    359360            //
    360             target.mergeFrom(source);
    361             objectsWithChildrenToMerge.add(source.getPrimitiveId());
     361            mergeFromSource = true;
    362362        } else if (target.isModified() && !source.isModified() && target.getVersion() == source.getVersion()) {
    363363            // target is same as source but target is modified
    364364            // => keep target and reset modified flag if target and source are semantically equal
     
    380380            // technical attributes like timestamp or user information. Semantic
    381381            // attributes should already be equal if we get here.
    382382            //
     383            mergeFromSource = true;
     384        }
     385        if (mergeFromSource) {
    383386            target.mergeFrom(source);
    384387            objectsWithChildrenToMerge.add(source.getPrimitiveId());
    385388        }