Ignore:
Timestamp:
2024-03-28T15:04:04+01:00 (14 months ago)
Author:
taylor.smock
Message:

Fix #23582: Reverter plugin reverts nodes that were not modified by the reverted changeset

File:
1 edited

Legend:

Unmodified
Added
Removed
  • applications/editors/josm/plugins/reverter/src/reverter/ChangesetReverter.java

    r36230 r36233  
    504504
    505505    public void fixNodesWithoutCoordinates(ProgressMonitor progressMonitor) throws OsmTransferException {
    506         Collection<Node> nodes = nds.getNodes();
     506        Collection<Node> nodes = new ArrayList<>(nds.getNodes());
    507507        int num = nodes.size();
    508508        progressMonitor.beginTask(addChangesetIdPrefix(
     
    510510                // downloads == num ticks, then we get the downloaded data (1 tick), then we process the nodes (num ticks)
    511511                2 * num + 1);
     512
     513        // Remove primitives where we already know the LatLon.
     514        nodes.removeIf(n -> {
     515            PrimitiveId id = n.getPrimitiveId();
     516            OsmPrimitive p = ds.getPrimitiveById(id);
     517            return !(p instanceof Node) || ((Node) p).isLatLonKnown();
     518        });
     519        progressMonitor.worked(num - nodes.size());
    512520
    513521        // Do bulk version fetches first
     
    526534                versionMap.replaceAll((key, value) -> value - 1);
    527535                versionMap.values().removeIf(i -> i <= 0);
    528                 ds.update(() -> {
    529                     for (Node n : nodes) {
    530                         if (!n.isDeleted() && !n.isLatLonKnown()) {
    531                             final Node historyNode = (Node) history.getPrimitiveById(n);
    532                             if (historyNode != null && historyNode.isLatLonKnown()
    533                                     && changeset.getClosedAt().isAfter(historyNode.getInstant())) {
    534                                 n.load(historyNode.save());
    535                                 versionMap.remove(n.getUniqueId());
    536                                 progressMonitor.worked(1);
    537                             }
    538                         }
    539                         if (progressMonitor.isCanceled()) {
    540                             break;
    541                         }
    542                     }
    543                 });
     536                ds.update(() -> updateNodes(progressMonitor, nodes, versionMap, history));
    544537                if (progressMonitor.isCanceled()) {
    545538                    break;
     
    548541        } finally {
    549542            progressMonitor.finishTask();
     543        }
     544    }
     545
     546    /**
     547     * Update nodes lacking a lat/lon
     548     * @param progressMonitor The monitor to update
     549     * @param nodes The nodes to update
     550     * @param versionMap The version map to update for the next round
     551     * @param history The history dataset
     552     */
     553    private void updateNodes(ProgressMonitor progressMonitor, Collection<Node> nodes, Map<Long, Integer> versionMap, DataSet history) {
     554        for (Node n : nodes) {
     555            if (!n.isDeleted() && !n.isLatLonKnown()) {
     556                final Node historyNode = (Node) history.getPrimitiveById(n);
     557                if (historyNode != null && historyNode.isLatLonKnown()
     558                        && changeset.getClosedAt().isAfter(historyNode.getInstant())) {
     559                    n.load(historyNode.save());
     560                    versionMap.remove(n.getUniqueId());
     561                    progressMonitor.worked(1);
     562                }
     563            }
     564            if (progressMonitor.isCanceled()) {
     565                break;
     566            }
    550567        }
    551568    }
Note: See TracChangeset for help on using the changeset viewer.