Modified: 
jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/AbstractDecoratedNodeState.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/AbstractDecoratedNodeState.java?rev=1815885&r1=1815884&r2=1815885&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/AbstractDecoratedNodeState.java
 (original)
+++ 
jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/AbstractDecoratedNodeState.java
 Tue Nov 21 08:33:10 2017
@@ -24,7 +24,6 @@ import org.apache.jackrabbit.oak.api.Typ
 import org.apache.jackrabbit.oak.plugins.memory.EmptyNodeState;
 import org.apache.jackrabbit.oak.plugins.memory.MemoryChildNodeEntry;
 import org.apache.jackrabbit.oak.plugins.memory.PropertyStates;
-import org.apache.jackrabbit.oak.plugins.tree.impl.TreeConstants;
 import org.apache.jackrabbit.oak.spi.state.AbstractNodeState;
 import org.apache.jackrabbit.oak.spi.state.ChildNodeEntry;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
@@ -37,6 +36,7 @@ import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 
 import static com.google.common.base.Predicates.notNull;
 import static 
org.apache.jackrabbit.oak.plugins.tree.impl.TreeConstants.OAK_CHILD_ORDER;
@@ -49,6 +49,10 @@ public abstract class AbstractDecoratedN
         this.delegate = delegate;
     }
 
+    public NodeState getDelegate() {
+        return delegate;
+    }
+
     protected boolean hideChild(@Nonnull final String name, @Nonnull final 
NodeState delegateChild) {
         return false;
     }
@@ -65,6 +69,11 @@ public abstract class AbstractDecoratedN
         return false;
     }
 
+    @Nonnull
+    protected Iterable<PropertyState> getNewPropertyStates() {
+        return Collections.emptyList();
+    }
+
     @CheckForNull
     protected abstract PropertyState decorateProperty(@Nonnull final 
PropertyState delegatePropertyState);
 
@@ -150,7 +159,16 @@ public abstract class AbstractDecoratedN
     @Override
     @CheckForNull
     public PropertyState getProperty(@Nonnull String name) {
-        return decorate(delegate.getProperty(name));
+        PropertyState ps = decorate(delegate.getProperty(name));
+        if (ps == null) {
+            for (PropertyState p : getNewPropertyStates()) {
+                if (name.equals(p.getName())) {
+                    ps = p;
+                    break;
+                }
+            }
+        }
+        return ps;
     }
 
     @Override
@@ -166,7 +184,7 @@ public abstract class AbstractDecoratedN
                     }
                 }
         );
-        return Iterables.filter(propertyStates, notNull());
+        return Iterables.filter(Iterables.concat(propertyStates, 
getNewPropertyStates()), notNull());
     }
 
     /**

Modified: 
jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/FilteringNodeState.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/FilteringNodeState.java?rev=1815885&r1=1815884&r2=1815885&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/FilteringNodeState.java
 (original)
+++ 
jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/FilteringNodeState.java
 Tue Nov 21 08:33:10 2017
@@ -67,6 +67,10 @@ public class FilteringNodeState extends
 
     private final Set<String> excludedPaths;
 
+    private final Set<String> fragmentPaths;
+
+    private final Set<String> excludedFragments;
+
     /**
      * Factory method that conditionally decorates the given node-state
      * iff the node-state is (a) hidden itself or (b) has hidden descendants.
@@ -75,6 +79,8 @@ public class FilteringNodeState extends
      * @param delegate The node-state to decorate.
      * @param includePaths A Set of paths that should be visible. Defaults to 
["/"] if {@code null}.
      * @param excludePaths A Set of paths that should be hidden. Empty if 
{@code null}.
+     * @param fragmentPaths A Set of paths that should support the fragments 
(see below). Empty if {@code null}.
+     * @param excludedFragments A Set of name fragments that should be hidden. 
Empty if {@code null}.
      * @return The decorated node-state if required, the original node-state 
if decoration is unnecessary.
      */
     @Nonnull
@@ -82,12 +88,16 @@ public class FilteringNodeState extends
             @Nonnull final String path,
             @Nonnull final NodeState delegate,
             @Nullable final Set<String> includePaths,
-            @Nullable final Set<String> excludePaths
+            @Nullable final Set<String> excludePaths,
+            @Nullable final Set<String> fragmentPaths,
+            @Nullable final Set<String> excludedFragments
     ) {
         final Set<String> includes = defaultIfEmpty(includePaths, ALL);
         final Set<String> excludes = defaultIfEmpty(excludePaths, NONE);
-        if (hasHiddenDescendants(path, includes, excludes)) {
-            return new FilteringNodeState(path, delegate, includes, excludes);
+        final Set<String> safeFragmentPaths = defaultIfEmpty(fragmentPaths, 
NONE);
+        final Set<String> safeExcludedFragments = 
defaultIfEmpty(excludedFragments, NONE);
+        if (hasHiddenDescendants(path, includes, excludes, safeFragmentPaths, 
safeExcludedFragments)) {
+            return new FilteringNodeState(path, delegate, includes, excludes, 
fragmentPaths, safeExcludedFragments);
         }
         return delegate;
     }
@@ -96,24 +106,28 @@ public class FilteringNodeState extends
             @Nonnull final String path,
             @Nonnull final NodeState delegate,
             @Nonnull final Set<String> includedPaths,
-            @Nonnull final Set<String> excludedPaths
+            @Nonnull final Set<String> excludedPaths,
+            @Nonnull final Set<String> fragmentPaths,
+            @Nonnull final Set<String> excludedFragments
     ) {
         super(delegate);
         this.path = path;
         this.includedPaths = includedPaths;
         this.excludedPaths = excludedPaths;
+        this.fragmentPaths = fragmentPaths;
+        this.excludedFragments = excludedFragments;
     }
 
     @Nonnull
     @Override
     protected NodeState decorateChild(@Nonnull final String name, @Nonnull 
final NodeState child) {
         final String childPath = PathUtils.concat(path, name);
-        return wrap(childPath, child, includedPaths, excludedPaths);
+        return wrap(childPath, child, includedPaths, excludedPaths, 
fragmentPaths, excludedFragments);
     }
 
     @Override
     protected boolean hideChild(@Nonnull final String name, @Nonnull final 
NodeState delegateChild) {
-        return isHidden(PathUtils.concat(path, name), includedPaths, 
excludedPaths);
+        return isHidden(PathUtils.concat(path, name), includedPaths, 
excludedPaths, excludedFragments);
     }
 
     @Override
@@ -128,14 +142,16 @@ public class FilteringNodeState extends
      * @param path Path to be checked
      * @param includes Include paths
      * @param excludes Exclude paths
+     * @param excludedFragments Exclude fragments
      * @return Whether the {@code path} is hidden or not.
      */
     private static boolean isHidden(
             @Nonnull final String path,
             @Nonnull final Set<String> includes,
-            @Nonnull final Set<String> excludes
+            @Nonnull final Set<String> excludes,
+            @Nonnull final Set<String> excludedFragments
     ) {
-        return isExcluded(path, excludes) || !isIncluded(path, includes);
+        return isExcluded(path, excludes, excludedFragments) || 
!isIncluded(path, includes);
     }
 
     /**
@@ -145,14 +161,20 @@ public class FilteringNodeState extends
      * @param path Path to be checked
      * @param includePaths Include paths
      * @param excludePaths Exclude paths
+     * @param excludedFragments Exclude fragments
      * @return Whether the {@code path} or any of its descendants are hidden 
or not.
      */
     private static boolean hasHiddenDescendants(
             @Nonnull final String path,
             @Nonnull final Set<String> includePaths,
-            @Nonnull final Set<String> excludePaths
+            @Nonnull final Set<String> excludePaths,
+            @Nonnull final Set<String> fragmentPaths,
+            @Nonnull final Set<String> excludedFragments
     ) {
-        return isHidden(path, includePaths, excludePaths)
+        return isHidden(path, includePaths, excludePaths, excludedFragments)
+                || isAncestorOfAnyPath(path, fragmentPaths)
+                || isDescendantOfAnyPath(path, fragmentPaths)
+                || fragmentPaths.contains(path)
                 || isAncestorOfAnyPath(path, excludePaths)
                 || isAncestorOfAnyPath(path, includePaths);
     }
@@ -181,10 +203,11 @@ public class FilteringNodeState extends
      *
      * @param path Path to be checked
      * @param excludePaths Exclude paths
+     * @param excludedFragments Exclude fragments
      * @return Whether the path is covered by the excldue paths or not.
      */
-    private static boolean isExcluded(@Nonnull final String path, @Nonnull 
final Set<String> excludePaths) {
-        return excludePaths.contains(path) || isDescendantOfAnyPath(path, 
excludePaths);
+    private static boolean isExcluded(@Nonnull final String path, @Nonnull 
final Set<String> excludePaths, @Nonnull final Set<String> excludedFragments) {
+        return excludePaths.contains(path) || isDescendantOfAnyPath(path, 
excludePaths) || containsAnyFragment(path, excludedFragments);
     }
 
     /**
@@ -218,6 +241,22 @@ public class FilteringNodeState extends
                 return true;
             }
         }
+        return false;
+    }
+
+    /**
+     * Utility method to check whether the passed path contains any of the 
provided {@code fragments}.
+     *
+     * @param path Path
+     * @param fragments Fragments, which the path may contain
+     * @return true if {@code path} contains any of the {@code fragments}, 
false otherwise.
+     */
+    private static boolean containsAnyFragment(@Nonnull final String path, 
@Nonnull final Set<String> fragments) {
+        for (final String f : fragments) {
+            if (path.contains(f)) {
+                return true;
+            }
+        }
         return false;
     }
 

Modified: 
jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/NameFilteringNodeState.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/NameFilteringNodeState.java?rev=1815885&r1=1815884&r2=1815885&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/NameFilteringNodeState.java
 (original)
+++ 
jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/NameFilteringNodeState.java
 Tue Nov 21 08:33:10 2017
@@ -18,7 +18,6 @@ package org.apache.jackrabbit.oak.upgrad
 
 import com.google.common.base.Charsets;
 import org.apache.jackrabbit.oak.api.PropertyState;
-import org.apache.jackrabbit.oak.plugins.document.util.Utils;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -70,7 +69,7 @@ public class NameFilteringNodeState exte
      *
      * @param name
      *            to check
-     * @return true if the name is longer than {@link Utils#NODE_NAME_LIMIT}
+     * @return true if the name is longer than {@code 
org.apache.jackrabbit.oak.plugins.document.util.Utils#NODE_NAME_LIMIT}
      */
     public static boolean isNameTooLong(@Nonnull String name) {
         // OAK-1589: maximum supported length of name for DocumentNodeStore

Modified: 
jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/NodeStateCopier.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/NodeStateCopier.java?rev=1815885&r1=1815884&r2=1815885&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/NodeStateCopier.java
 (original)
+++ 
jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/NodeStateCopier.java
 Tue Nov 21 08:33:10 2017
@@ -65,6 +65,9 @@ import static java.util.Collections.empt
  * <b>Exclude paths:</b> if exclude paths are set, any nodes matching
  * or below the excluded path are not copied. If an excluded node does
  * exist in the target, it is removed (see also merge paths).
+ * <b>Exclude fragments:</b> if exclude fragments are set, nodes with names
+ * matching any of the fragments (and their subtrees) are not copied. If an
+ * excluded node does exist in the target, it is removed.
  * <b>Merge paths:</b> if merge paths are set, any nodes matching or
  * below the merged path will not be deleted from target, even if they
  * are missing in (or excluded from) the source.
@@ -77,11 +80,17 @@ public class NodeStateCopier {
 
     private final Set<String> excludePaths;
 
+    private final Set<String> fragmentPaths;
+
+    private final Set<String> excludeFragments;
+
     private final Set<String> mergePaths;
 
-    private NodeStateCopier(Set<String> includePaths, Set<String> 
excludePaths, Set<String> mergePaths) {
+    private NodeStateCopier(Set<String> includePaths, Set<String> 
excludePaths, Set<String> fragmentPaths, Set<String> excludeFragments, 
Set<String> mergePaths) {
         this.includePaths = includePaths;
         this.excludePaths = excludePaths;
+        this.fragmentPaths = fragmentPaths;
+        this.excludeFragments = excludeFragments;
         this.mergePaths = mergePaths;
     }
 
@@ -89,7 +98,7 @@ public class NodeStateCopier {
      * Create a NodeStateCopier.Builder.
      *
      * @return a NodeStateCopier.Builder
-     * @see org.apache.jackrabbit.oak.upgrade.nodestate.NodeStateCopier.Builder
+     * @see NodeStateCopier.Builder
      */
     public static Builder builder() {
         return new Builder();
@@ -103,7 +112,7 @@ public class NodeStateCopier {
      * @param target NodeStore to copy to.
      * @return true if the target has been modified
      * @throws CommitFailedException if the operation fails
-     * @see 
org.apache.jackrabbit.oak.upgrade.nodestate.NodeStateCopier.Builder#copy(NodeStore,
 NodeStore)
+     * @see NodeStateCopier.Builder#copy(NodeStore, NodeStore)
      */
     public static boolean copyNodeStore(@Nonnull final NodeStore source, 
@Nonnull final NodeStore target)
             throws CommitFailedException {
@@ -141,7 +150,7 @@ public class NodeStateCopier {
     }
 
     private boolean copyNodeState(@Nonnull final NodeState sourceRoot, 
@Nonnull final NodeBuilder targetRoot) {
-        final NodeState wrappedSource = FilteringNodeState.wrap("/", 
sourceRoot, this.includePaths, this.excludePaths);
+        final NodeState wrappedSource = FilteringNodeState.wrap("/", 
sourceRoot, this.includePaths, this.excludePaths, this.fragmentPaths, 
this.excludeFragments);
         boolean hasChanges = false;
         for (String includePath : this.includePaths) {
             hasChanges = copyMissingAncestors(sourceRoot, targetRoot, 
includePath) || hasChanges;
@@ -294,6 +303,10 @@ public class NodeStateCopier {
 
         private Set<String> excludePaths = emptySet();
 
+        private Set<String> fragmentPaths = emptySet();
+
+        private Set<String> excludeFragments = emptySet();
+
         private Set<String> mergePaths = emptySet();
 
         private Builder() {}
@@ -304,7 +317,7 @@ public class NodeStateCopier {
          *
          * @param paths include paths
          * @return this Builder instance
-         * @see NodeStateCopier#NodeStateCopier(Set, Set, Set)
+         * @see NodeStateCopier#NodeStateCopier(Set, Set, Set, Set, Set)
          */
         @Nonnull
         public Builder include(@Nonnull Set<String> paths) {
@@ -319,7 +332,7 @@ public class NodeStateCopier {
          *
          * @param paths include paths
          * @return this Builder instance
-         * @see NodeStateCopier#NodeStateCopier(Set, Set, Set)
+         * @see NodeStateCopier#NodeStateCopier(Set, Set, Set, Set, Set)
          */
         @Nonnull
         public Builder include(@Nonnull String... paths) {
@@ -331,7 +344,7 @@ public class NodeStateCopier {
          *
          * @param paths exclude paths
          * @return this Builder instance
-         * @see NodeStateCopier#NodeStateCopier(Set, Set, Set)
+         * @see NodeStateCopier#NodeStateCopier(Set, Set, Set, Set, Set)
          */
         @Nonnull
         public Builder exclude(@Nonnull Set<String> paths) {
@@ -346,7 +359,7 @@ public class NodeStateCopier {
          *
          * @param paths exclude paths
          * @return this Builder instance
-         * @see NodeStateCopier#NodeStateCopier(Set, Set, Set)
+         * @see NodeStateCopier#NodeStateCopier(Set, Set, Set, Set, Set)
          */
         @Nonnull
         public Builder exclude(@Nonnull String... paths) {
@@ -354,11 +367,65 @@ public class NodeStateCopier {
         }
 
         /**
+         * Set fragment paths.
+         *
+         * @param paths fragment paths
+         * @return this Builder instance
+         * @see NodeStateCopier#NodeStateCopier(Set, Set, Set, Set, Set)
+         */
+        @Nonnull
+        public Builder supportFragment(@Nonnull Set<String> paths) {
+            if (!checkNotNull(paths).isEmpty()) {
+                this.fragmentPaths = copyOf(paths);
+            }
+            return this;
+        }
+
+        /**
+         * Convenience wrapper for {@link #supportFragment(Set)}.
+         *
+         * @param paths fragment paths
+         * @return this Builder instance
+         * @see NodeStateCopier#NodeStateCopier(Set, Set, Set, Set, Set)
+         */
+        @Nonnull
+        public Builder supportFragment(@Nonnull String... paths) {
+            return supportFragment(copyOf(checkNotNull(paths)));
+        }
+
+        /**
+         * Set exclude fragments.
+         *
+         * @param fragments exclude fragments
+         * @return this Builder instance
+         * @see NodeStateCopier#NodeStateCopier(Set, Set, Set, Set, Set)
+         */
+        @Nonnull
+        public Builder excludeFragments(@Nonnull Set<String> fragments) {
+            if (!checkNotNull(fragments).isEmpty()) {
+                this.excludeFragments = copyOf(fragments);
+            }
+            return this;
+        }
+
+        /**
+         * Convenience wrapper for {@link #exclude(Set)}.
+         *
+         * @param fragments exclude fragments
+         * @return this Builder instance
+         * @see NodeStateCopier#NodeStateCopier(Set, Set, Set, Set, Set)
+         */
+        @Nonnull
+        public Builder excludeFragments(@Nonnull String... fragments) {
+            return exclude(copyOf(checkNotNull(fragments)));
+        }
+
+        /**
          * Set merge paths.
          *
          * @param paths merge paths
          * @return this Builder instance
-         * @see NodeStateCopier#NodeStateCopier(Set, Set, Set)
+         * @see NodeStateCopier#NodeStateCopier(Set, Set, Set, Set, Set)
          */
         @Nonnull
         public Builder merge(@Nonnull Set<String> paths) {
@@ -373,7 +440,7 @@ public class NodeStateCopier {
          *
          * @param paths merge paths
          * @return this Builder instance
-         * @see NodeStateCopier#NodeStateCopier(Set, Set, Set)
+         * @see NodeStateCopier#NodeStateCopier(Set, Set, Set, Set, Set)
          */
         @Nonnull
         public Builder merge(@Nonnull String... paths) {
@@ -394,7 +461,7 @@ public class NodeStateCopier {
          *         the same content
          */
         public boolean copy(@Nonnull final NodeState sourceRoot, @Nonnull 
final NodeBuilder targetRoot) {
-            final NodeStateCopier copier = new NodeStateCopier(includePaths, 
excludePaths, mergePaths);
+            final NodeStateCopier copier = new NodeStateCopier(includePaths, 
excludePaths, fragmentPaths, excludeFragments, mergePaths);
             return copier.copyNodeState(checkNotNull(sourceRoot), 
checkNotNull(targetRoot));
         }
 

Modified: 
jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/LoggingReporter.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/LoggingReporter.java?rev=1815885&r1=1815884&r2=1815885&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/LoggingReporter.java
 (original)
+++ 
jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/LoggingReporter.java
 Tue Nov 21 08:33:10 2017
@@ -18,6 +18,7 @@
  */
 package org.apache.jackrabbit.oak.upgrade.nodestate.report;
 
+import com.google.common.collect.EvictingQueue;
 import org.apache.jackrabbit.oak.commons.PathUtils;
 import org.slf4j.Logger;
 
@@ -34,6 +35,8 @@ public class LoggingReporter extends Per
 
     private final String verb;
 
+    private final EvictingQueue lastPaths = EvictingQueue.create(100);
+
     /**
      * Constructor that allows setting the intervals to log node and property
      * accesses to a given logger.
@@ -72,4 +75,14 @@ public class LoggingReporter extends Per
     protected void reportPeriodicProperty(final long count, @Nonnull final 
ReportingNodeState parent, @Nonnull final String propertyName) {
         logger.info("{} properties #{}: {}", verb, count, 
PathUtils.concat(parent.getPath(), propertyName));
     }
-}
+
+    protected boolean skipNodeState(@Nonnull final ReportingNodeState 
nodeState) {
+        String path = nodeState.getPath();
+        if (lastPaths.contains(path)) {
+            return true;
+        } else {
+            lastPaths.add(path);
+            return false;
+        }
+    }
+}
\ No newline at end of file

Modified: 
jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/PeriodicReporter.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/PeriodicReporter.java?rev=1815885&r1=1815884&r2=1815885&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/PeriodicReporter.java
 (original)
+++ 
jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/PeriodicReporter.java
 Tue Nov 21 08:33:10 2017
@@ -68,12 +68,21 @@ public abstract class PeriodicReporter i
     protected abstract void reportPeriodicProperty(
             final long count, @Nonnull final ReportingNodeState parent, 
@Nonnull final String propertyName);
 
+
+    protected boolean skipNodeState(@Nonnull final ReportingNodeState 
nodeState) {
+        return false;
+    }
+
     @Override
     public final void reportNode(@Nonnull final ReportingNodeState nodeState) {
         if (nodeLogInterval == -1) {
             return;
         }
 
+        if (skipNodeState(nodeState)) {
+            return;
+        }
+
         final long count = nodes.incrementAndGet();
         if (count % nodeLogInterval == 0) {
             reportPeriodicNode(count, nodeState);

Modified: 
jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionCopier.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionCopier.java?rev=1815885&r1=1815884&r2=1815885&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionCopier.java
 (original)
+++ 
jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionCopier.java
 Tue Nov 21 08:33:10 2017
@@ -16,24 +16,20 @@
  */
 package org.apache.jackrabbit.oak.upgrade.version;
 
-import static org.apache.jackrabbit.JcrConstants.JCR_CREATED;
 import static org.apache.jackrabbit.JcrConstants.NT_VERSION;
 
 import java.util.Calendar;
 import java.util.Iterator;
 
-import org.apache.jackrabbit.oak.api.Type;
 import org.apache.jackrabbit.oak.plugins.nodetype.TypePredicate;
-import org.apache.jackrabbit.oak.spi.state.ChildNodeEntry;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.apache.jackrabbit.oak.upgrade.DescendantsIterator;
 import org.apache.jackrabbit.oak.upgrade.nodestate.NodeStateCopier;
-import org.apache.jackrabbit.util.ISO8601;
 
 import static 
org.apache.jackrabbit.oak.plugins.version.VersionConstants.VERSION_STORE_PATH;
-
 import static 
org.apache.jackrabbit.oak.upgrade.version.VersionHistoryUtil.getRelativeVersionHistoryPath;
+import static 
org.apache.jackrabbit.oak.upgrade.version.VersionHistoryUtil.getVersionHistoryLastModified;
 import static 
org.apache.jackrabbit.oak.upgrade.version.VersionHistoryUtil.getVersionHistoryNodeState;
 
 /**
@@ -94,21 +90,4 @@ public class VersionCopier {
         return false;
     }
 
-    private Calendar getVersionHistoryLastModified(final NodeState 
versionHistory) {
-        Calendar youngest = Calendar.getInstance();
-        youngest.setTimeInMillis(0);
-        for (final ChildNodeEntry entry : 
versionHistory.getChildNodeEntries()) {
-            final NodeState version = entry.getNodeState();
-            if (!isVersion.apply(version)) {
-                continue;
-            }
-            if (version.hasProperty(JCR_CREATED)) {
-                final Calendar created = 
ISO8601.parse(version.getProperty(JCR_CREATED).getValue(Type.DATE));
-                if (created.after(youngest)) {
-                    youngest = created;
-                }
-            }
-        }
-        return youngest;
-    }
 }

Modified: 
jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionHistoryUtil.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionHistoryUtil.java?rev=1815885&r1=1815884&r2=1815885&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionHistoryUtil.java
 (original)
+++ 
jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionHistoryUtil.java
 Tue Nov 21 08:33:10 2017
@@ -16,24 +16,46 @@
  */
 package org.apache.jackrabbit.oak.upgrade.version;
 
+import static com.google.common.collect.ImmutableSet.of;
 import static com.google.common.collect.Iterables.concat;
+import static com.google.common.collect.Sets.newHashSet;
 import static java.util.Collections.singleton;
+import static org.apache.jackrabbit.JcrConstants.JCR_BASEVERSION;
+import static org.apache.jackrabbit.JcrConstants.JCR_CREATED;
+import static org.apache.jackrabbit.JcrConstants.JCR_ISCHECKEDOUT;
+import static org.apache.jackrabbit.JcrConstants.JCR_MIXINTYPES;
+import static org.apache.jackrabbit.JcrConstants.JCR_PREDECESSORS;
 import static org.apache.jackrabbit.JcrConstants.JCR_PRIMARYTYPE;
 import static org.apache.jackrabbit.JcrConstants.JCR_SYSTEM;
+import static org.apache.jackrabbit.JcrConstants.JCR_UUID;
+import static org.apache.jackrabbit.JcrConstants.JCR_VERSIONHISTORY;
 import static org.apache.jackrabbit.JcrConstants.JCR_VERSIONSTORAGE;
+import static org.apache.jackrabbit.JcrConstants.MIX_REFERENCEABLE;
+import static org.apache.jackrabbit.JcrConstants.MIX_VERSIONABLE;
+import static 
org.apache.jackrabbit.oak.plugins.memory.MultiGenericPropertyState.nameProperty;
 import static 
org.apache.jackrabbit.oak.plugins.version.VersionConstants.REP_VERSIONSTORAGE;
 
 import java.util.ArrayList;
+import java.util.Calendar;
 import java.util.List;
+import java.util.Set;
 
 import org.apache.jackrabbit.oak.api.Type;
+import org.apache.jackrabbit.oak.commons.PathUtils;
+import org.apache.jackrabbit.oak.plugins.nodetype.TypePredicate;
+import org.apache.jackrabbit.oak.spi.state.ChildNodeEntry;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 
 import com.google.common.base.Joiner;
+import org.apache.jackrabbit.util.ISO8601;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class VersionHistoryUtil {
 
+    private static final Logger LOG = 
LoggerFactory.getLogger(VersionHistoryUtil.class);
+
     public static String getRelativeVersionHistoryPath(String versionableUuid) 
{
         return Joiner.on('/').join(concat(
                 singleton(""),
@@ -44,7 +66,7 @@ public class VersionHistoryUtil {
     /**
      * Constructs the version history path based on the versionable's UUID.
      *
-     * @param root The root NodeState below which to look for the version.
+     * @param versionStorage below which to look for the version.
      * @param versionableUuid The String representation of the versionable's 
UUID.
      * @return The NodeState corresponding to the version history, or {@code 
null}
      *         if it does not exist.
@@ -57,7 +79,7 @@ public class VersionHistoryUtil {
         return historyParent.getChildNode(versionableUuid);
     }
 
-    static NodeBuilder getVersionHistoryBuilder(NodeBuilder versionStorage, 
String versionableUuid) {
+    public static NodeBuilder getVersionHistoryBuilder(NodeBuilder 
versionStorage, String versionableUuid) {
         NodeBuilder history = versionStorage;
         for (String segment : 
getRelativeVersionHistoryPathSegments(versionableUuid)) {
             history = history.getChildNode(segment);
@@ -89,4 +111,108 @@ public class VersionHistoryUtil {
         return vs;
     }
 
+    public static List<String> getVersionableNodes(NodeState root, 
TypePredicate isVersionable, Calendar olderThan) {
+        List<String> paths = new ArrayList<>();
+        NodeState versionStorage = getVersionStorage(root);
+        getVersionableNodes(root, versionStorage, isVersionable, olderThan, 
PathUtils.ROOT_PATH, paths);
+        return paths;
+    }
+
+
+    private static void getVersionableNodes(NodeState node, NodeState 
versionStorage, TypePredicate isVersionable, Calendar olderThan, String path, 
List<String> paths) {
+        if (isVersionable.apply(node)) {
+            if (olderThan == null) {
+                paths.add(path);
+            } else {
+                NodeState versionHistory = 
getVersionHistoryNodeState(versionStorage, node.getString(JCR_UUID));
+                Calendar lastModified = 
getVersionHistoryLastModified(versionHistory);
+                if (lastModified.before(olderThan)) {
+                    paths.add(path);
+                }
+            }
+        }
+        for (ChildNodeEntry c : node.getChildNodeEntries()) {
+            getVersionableNodes(c.getNodeState(), versionStorage, 
isVersionable, olderThan, PathUtils.concat(path, c.getName()), paths);
+        }
+    }
+
+    public static Calendar getVersionHistoryLastModified(NodeState 
versionHistory) {
+        Calendar youngest = Calendar.getInstance();
+        youngest.setTimeInMillis(0);
+        for (final ChildNodeEntry entry : 
versionHistory.getChildNodeEntries()) {
+            final NodeState version = entry.getNodeState();
+            if (version.hasProperty(JCR_CREATED)) {
+                final Calendar created = 
ISO8601.parse(version.getProperty(JCR_CREATED).getValue(Type.DATE));
+                if (created.after(youngest)) {
+                    youngest = created;
+                }
+            }
+        }
+        return youngest;
+    }
+
+    public static void removeVersionProperties(NodeBuilder versionableBuilder, 
TypePredicate isReferenceable) {
+        assert versionableBuilder.exists();
+
+        removeMixin(versionableBuilder, MIX_VERSIONABLE);
+
+        // we don't know if the UUID is otherwise referenced,
+        // so make sure the node remains referencable
+        if (!isReferenceable.apply(versionableBuilder.getNodeState())) {
+            addMixin(versionableBuilder, MIX_REFERENCEABLE);
+        }
+
+        versionableBuilder.removeProperty(JCR_VERSIONHISTORY);
+        versionableBuilder.removeProperty(JCR_PREDECESSORS);
+        versionableBuilder.removeProperty(JCR_BASEVERSION);
+        versionableBuilder.removeProperty(JCR_ISCHECKEDOUT);
+    }
+
+    static void addMixin(NodeBuilder builder, String name) {
+        if (builder.hasProperty(JCR_MIXINTYPES)) {
+            final Set<String> mixins = 
newHashSet(builder.getProperty(JCR_MIXINTYPES).getValue(Type.NAMES));
+            if (mixins.add(name)) {
+                builder.setProperty(nameProperty(JCR_MIXINTYPES, mixins));
+            }
+        } else {
+            builder.setProperty(nameProperty(JCR_MIXINTYPES, of(name)));
+        }
+    }
+
+    private static void removeMixin(NodeBuilder builder, String name) {
+        if (builder.hasProperty(JCR_MIXINTYPES)) {
+            final Set<String> mixins = 
newHashSet(builder.getProperty(JCR_MIXINTYPES).getValue(Type.NAMES));
+            if (mixins.remove(name)) {
+                if (mixins.isEmpty()) {
+                    builder.removeProperty(JCR_MIXINTYPES);
+                } else {
+                    builder.setProperty(nameProperty(JCR_MIXINTYPES, mixins));
+                }
+            }
+        }
+    }
+
+    public static NodeBuilder removeVersions(NodeState root,
+                               List<String> toRemove) {
+        NodeBuilder rootBuilder = root.builder();
+        TypePredicate isReferenceable = new TypePredicate(root, 
MIX_REFERENCEABLE);
+        NodeBuilder versionStorage = getVersionStorage(rootBuilder);
+        for (String p : toRemove) {
+            LOG.info("Removing version history for {}", p);
+            NodeBuilder b = getBuilder(rootBuilder, p);
+            String uuid = b.getString(JCR_UUID);
+            VersionHistoryUtil.removeVersionProperties(b, isReferenceable);
+            getVersionHistoryBuilder(versionStorage, uuid).remove();
+        }
+        return rootBuilder;
+    }
+
+    private static NodeBuilder getBuilder(NodeBuilder root, String path) {
+        NodeBuilder builder = root;
+        for (String e : PathUtils.elements(path)) {
+            builder = builder.child(e);
+        }
+        return builder;
+    }
+
 }

Modified: 
jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionableEditor.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionableEditor.java?rev=1815885&r1=1815884&r2=1815885&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionableEditor.java
 (original)
+++ 
jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionableEditor.java
 Tue Nov 21 08:33:10 2017
@@ -34,20 +34,14 @@ import java.util.Collections;
 import java.util.Set;
 
 import static com.google.common.collect.ImmutableSet.of;
-import static com.google.common.collect.Sets.newHashSet;
-import static org.apache.jackrabbit.JcrConstants.JCR_BASEVERSION;
-import static org.apache.jackrabbit.JcrConstants.JCR_ISCHECKEDOUT;
-import static org.apache.jackrabbit.JcrConstants.JCR_MIXINTYPES;
-import static org.apache.jackrabbit.JcrConstants.JCR_PREDECESSORS;
 import static org.apache.jackrabbit.JcrConstants.JCR_UUID;
-import static org.apache.jackrabbit.JcrConstants.JCR_VERSIONHISTORY;
 import static org.apache.jackrabbit.JcrConstants.MIX_REFERENCEABLE;
 import static org.apache.jackrabbit.JcrConstants.MIX_VERSIONABLE;
-import static 
org.apache.jackrabbit.oak.plugins.memory.MultiGenericPropertyState.nameProperty;
 import static 
org.apache.jackrabbit.oak.plugins.version.VersionConstants.MIX_REP_VERSIONABLE_PATHS;
+import static 
org.apache.jackrabbit.oak.upgrade.version.VersionHistoryUtil.addMixin;
 import static 
org.apache.jackrabbit.oak.upgrade.version.VersionHistoryUtil.getVersionHistoryBuilder;
-import static 
org.apache.jackrabbit.oak.upgrade.version.VersionHistoryUtil.getVersionHistoryNodeState;
 import static 
org.apache.jackrabbit.oak.upgrade.version.VersionHistoryUtil.getVersionStorage;
+import static 
org.apache.jackrabbit.oak.upgrade.version.VersionHistoryUtil.removeVersionProperties;
 
 /**
  * The VersionableEditor provides two possible ways to handle
@@ -57,7 +51,7 @@ import static org.apache.jackrabbit.oak.
  *     <li>
  *         it can skip copying version histories and remove the
  *         {@code mix:versionable} mixin together with any related
- *         properties (see {@link #removeVersionProperties(NodeBuilder)}).
+ *         properties (see {@link 
VersionHistoryUtil#removeVersionProperties(NodeBuilder, TypePredicate)}).
  *     </li>
  * </ul>
  */
@@ -144,7 +138,7 @@ public class VersionableEditor extends D
                 setVersionablePath(versionableUuid);
             } else {
                 NodeBuilder versionableBuilder = getNodeBuilder(rootBuilder, 
this.path);
-                removeVersionProperties(versionableBuilder);
+                removeVersionProperties(versionableBuilder, isReferenceable);
                 if (isVersionable.apply(versionableBuilder.getNodeState())) {
                     logger.warn("Node {} is still versionable. Creating empty 
version history.", path);
                     createEmptyHistory(versionableBuilder);
@@ -174,23 +168,6 @@ public class VersionableEditor extends D
         return getVersionHistoryBuilder(versionStorage, 
versionableUuid).exists();
     }
 
-    private void removeVersionProperties(final NodeBuilder versionableBuilder) 
{
-        assert versionableBuilder.exists();
-
-        removeMixin(versionableBuilder, MIX_VERSIONABLE);
-
-        // we don't know if the UUID is otherwise referenced,
-        // so make sure the node remains referencable
-        if (!isReferenceable.apply(versionableBuilder.getNodeState())) {
-            addMixin(versionableBuilder, MIX_REFERENCEABLE);
-        }
-
-        versionableBuilder.removeProperty(JCR_VERSIONHISTORY);
-        versionableBuilder.removeProperty(JCR_PREDECESSORS);
-        versionableBuilder.removeProperty(JCR_BASEVERSION);
-        versionableBuilder.removeProperty(JCR_ISCHECKEDOUT);
-    }
-
     private void createEmptyHistory(NodeBuilder versionable) throws 
CommitFailedException {
         vMgr.getOrCreateVersionHistory(versionable, 
Collections.<String,Object>emptyMap());
     }
@@ -225,27 +202,5 @@ public class VersionableEditor extends D
         return builder;
     }
 
-    private static void addMixin(NodeBuilder builder, String name) {
-        if (builder.hasProperty(JCR_MIXINTYPES)) {
-            final Set<String> mixins = 
newHashSet(builder.getProperty(JCR_MIXINTYPES).getValue(Type.NAMES));
-            if (mixins.add(name)) {
-                builder.setProperty(nameProperty(JCR_MIXINTYPES, mixins));
-            }
-        } else {
-            builder.setProperty(nameProperty(JCR_MIXINTYPES, of(name)));
-        }
-    }
 
-    private static void removeMixin(NodeBuilder builder, String name) {
-        if (builder.hasProperty(JCR_MIXINTYPES)) {
-            final Set<String> mixins = 
newHashSet(builder.getProperty(JCR_MIXINTYPES).getValue(Type.NAMES));
-            if (mixins.remove(name)) {
-                if (mixins.isEmpty()) {
-                    builder.removeProperty(JCR_MIXINTYPES);
-                } else {
-                    builder.setProperty(nameProperty(JCR_MIXINTYPES, mixins));
-                }
-            }
-        }
-    }
 }

Modified: 
jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionablePropertiesEditor.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionablePropertiesEditor.java?rev=1815885&r1=1815884&r2=1815885&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionablePropertiesEditor.java
 (original)
+++ 
jackrabbit/oak/branches/1.6/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionablePropertiesEditor.java
 Tue Nov 21 08:33:10 2017
@@ -69,8 +69,6 @@ public final class VersionableProperties
 
     private final TypePredicate isVersionable;
 
-    private final TypePredicate isSimpleVersionable;
-
     private final TypePredicate isNtVersion;
 
     private final TypePredicate isFrozenNode;
@@ -80,7 +78,6 @@ public final class VersionableProperties
         this.rootBuilder = rootBuilder;
         this.versionStorage = getVersionStorage(rootBuilder);
         this.isVersionable = new TypePredicate(rootBuilder.getNodeState(), 
MIX_VERSIONABLE);
-        this.isSimpleVersionable = new 
TypePredicate(rootBuilder.getNodeState(), MIX_SIMPLE_VERSIONABLE);
         this.isNtVersion = new TypePredicate(rootBuilder.getNodeState(), 
NT_VERSION);
         this.isFrozenNode = new TypePredicate(rootBuilder.getNodeState(), 
NT_FROZENNODE);
     }
@@ -90,7 +87,6 @@ public final class VersionableProperties
         this.rootBuilder = parent.rootBuilder;
         this.versionStorage = parent.versionStorage;
         this.isVersionable = parent.isVersionable;
-        this.isSimpleVersionable = parent.isSimpleVersionable;
         this.isNtVersion = parent.isNtVersion;
         this.isFrozenNode = parent.isFrozenNode;
     }

Modified: 
jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/CopyVersionHistorySidegradeTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/CopyVersionHistorySidegradeTest.java?rev=1815885&r1=1815884&r2=1815885&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/CopyVersionHistorySidegradeTest.java
 (original)
+++ 
jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/CopyVersionHistorySidegradeTest.java
 Tue Nov 21 08:33:10 2017
@@ -50,15 +50,10 @@ public class CopyVersionHistorySidegrade
     }
 
     @Override
-    protected Session performCopy(VersionCopySetup setup) throws 
RepositoryException, IOException {
-        final NodeStore targetNodeStore = new MemoryNodeStore();
-        final RepositorySidegrade sidegrade = new 
RepositorySidegrade(sourceNodeStore, targetNodeStore);
+    protected void migrate(VersionCopySetup setup, NodeStore target, String 
includePath) throws RepositoryException, IOException {
+        final RepositorySidegrade sidegrade = new 
RepositorySidegrade(sourceNodeStore, target);
+        sidegrade.setIncludes(includePath);
         setup.setup(sidegrade.versionCopyConfiguration);
-        sidegrade.copy(null);
-
-        repository = (RepositoryImpl) new Jcr(new 
Oak(targetNodeStore)).createRepository();
-        Session s = 
repository.login(AbstractRepositoryUpgradeTest.CREDENTIALS);
-        sessions.add(s);
-        return s;
+        sidegrade.copy();
     }
-}
+}
\ No newline at end of file

Modified: 
jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/CopyVersionHistoryTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/CopyVersionHistoryTest.java?rev=1815885&r1=1815884&r2=1815885&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/CopyVersionHistoryTest.java
 (original)
+++ 
jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/CopyVersionHistoryTest.java
 Tue Nov 21 08:33:10 2017
@@ -50,6 +50,7 @@ import com.google.common.collect.Maps;
 import org.apache.jackrabbit.core.RepositoryContext;
 import org.apache.jackrabbit.core.config.RepositoryConfig;
 import org.apache.jackrabbit.oak.Oak;
+import org.apache.jackrabbit.oak.commons.PathUtils;
 import org.apache.jackrabbit.oak.jcr.Jcr;
 import org.apache.jackrabbit.oak.jcr.repository.RepositoryImpl;
 import org.apache.jackrabbit.oak.segment.SegmentNodeStoreBuilders;
@@ -256,23 +257,50 @@ public class CopyVersionHistoryTest exte
                 .getPrimaryNodeType());
     }
 
+    @Test
+    public void removeVersionHistory() throws RepositoryException, IOException 
{
+        final NodeStore targetNodeStore = SegmentNodeStoreBuilders.builder(new 
MemoryStore()).build();
+        migrate(new VersionCopySetup() {
+            @Override
+            public void setup(VersionCopyConfiguration config) {
+            }
+        }, targetNodeStore, PathUtils.ROOT_PATH);
+        migrate(new VersionCopySetup() {
+            @Override
+            public void setup(VersionCopyConfiguration config) {
+                config.setCopyVersions(null);
+                config.setCopyOrphanedVersions(null);
+            }
+        }, targetNodeStore, "/versionables");
+        repository = (RepositoryImpl) new Jcr(new 
Oak(targetNodeStore)).createRepository();
+        Session s = 
repository.login(AbstractRepositoryUpgradeTest.CREDENTIALS);
+        sessions.add(s);
+        assertMissingHistories(s, VERSIONABLES_OLD, VERSIONABLES_YOUNG);
+        assertNonVersionablePaths(s, VERSIONABLES_OLD, VERSIONABLES_YOUNG);
+
+    }
+
     protected Session performCopy(VersionCopySetup setup) throws 
RepositoryException, IOException {
+        final NodeStore targetNodeStore = SegmentNodeStoreBuilders.builder(new 
MemoryStore()).build();
+        migrate(setup, targetNodeStore, PathUtils.ROOT_PATH);
+        repository = (RepositoryImpl) new Jcr(new 
Oak(targetNodeStore)).createRepository();
+        Session s = 
repository.login(AbstractRepositoryUpgradeTest.CREDENTIALS);
+        sessions.add(s);
+        return s;
+    }
+
+    protected void migrate(VersionCopySetup setup, NodeStore target, String 
includePath) throws RepositoryException, IOException {
         final RepositoryConfig sourceConfig = RepositoryConfig.create(source);
         final RepositoryContext sourceContext = 
RepositoryContext.create(sourceConfig);
-        final NodeStore targetNodeStore = SegmentNodeStoreBuilders.builder(new 
MemoryStore()).build();
         try {
-            final RepositoryUpgrade upgrade = new 
RepositoryUpgrade(sourceContext, targetNodeStore);
+            final RepositoryUpgrade upgrade = new 
RepositoryUpgrade(sourceContext, target);
+            upgrade.setIncludes(includePath);
             setup.setup(upgrade.versionCopyConfiguration);
-            upgrade.setEarlyShutdown(true);
+            upgrade.setEarlyShutdown(false);
             upgrade.copy(null);
         } finally {
             sourceContext.getRepository().shutdown();
         }
-
-        repository = (RepositoryImpl) new Jcr(new 
Oak(targetNodeStore)).createRepository();
-        Session s = 
repository.login(AbstractRepositoryUpgradeTest.CREDENTIALS);
-        sessions.add(s);
-        return s;
     }
 
     @After
@@ -358,6 +386,18 @@ public class CopyVersionHistoryTest exte
             }
         }
     }
+
+    private static void assertNonVersionablePaths(final Session session, final 
String... names)
+            throws RepositoryException {
+        for (final String mixin : MIXINS) {
+            final String pathPrefix = VERSIONABLES_PATH_PREFIX + mixin + "/";
+            for (final String name : names) {
+                final String path = pathPrefix + name;
+                final Node node = session.getNode(path);
+                assertFalse("Node " + path + " shouldn't have mix:versionable 
mixin", node.isNodeType(MIX_VERSIONABLE));
+            }
+        }
+    }
 
     private static void assertVersionablePath(final VersionHistory history, 
final String versionablePath)
             throws RepositoryException {

Modified: 
jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/IncludeExcludeSidegradeTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/IncludeExcludeSidegradeTest.java?rev=1815885&r1=1815884&r2=1815885&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/IncludeExcludeSidegradeTest.java
 (original)
+++ 
jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/IncludeExcludeSidegradeTest.java
 Tue Nov 21 08:33:10 2017
@@ -73,7 +73,8 @@ public class IncludeExcludeSidegradeTest
             final RepositorySidegrade sidegrade = new 
RepositorySidegrade(segmentNodeStore, target);
             sidegrade.setIncludes(
                     "/content/foo/en",
-                    "/content/assets/foo"
+                    "/content/assets/foo",
+                    "/content/other"
             );
             sidegrade.setExcludes(
                     "/content/assets/foo/2013",
@@ -81,6 +82,12 @@ public class IncludeExcludeSidegradeTest
                     "/content/assets/foo/2011",
                     "/content/assets/foo/2010"
             );
+            sidegrade.setExcludeFragments(
+                    "oak-mount-libs-xyz"
+            );
+            sidegrade.setFragmentPaths(
+                    "/content/other/path"
+            );
             sidegrade.copy();
         } finally {
             fileStore.close();

Modified: 
jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/IncludeExcludeUpgradeTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/IncludeExcludeUpgradeTest.java?rev=1815885&r1=1815884&r2=1815885&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/IncludeExcludeUpgradeTest.java
 (original)
+++ 
jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/IncludeExcludeUpgradeTest.java
 Tue Nov 21 08:33:10 2017
@@ -46,7 +46,10 @@ public class IncludeExcludeUpgradeTest e
         JcrUtils.getOrCreateByPath("/content/assets/foo/2011", "nt:folder", 
session);
         JcrUtils.getOrCreateByPath("/content/assets/foo/2010", "nt:folder", 
session);
         JcrUtils.getOrCreateByPath("/content/assets/foo/2010/12", "nt:folder", 
session);
-        JcrUtils.getOrCreateByPath("/content/assets/foo/2010/11", "nt:folder", 
session);
+        
JcrUtils.getOrCreateByPath("/content/other/path/foo/oak-mount-libs-xyz/node1", 
"nt:folder", session);
+        
JcrUtils.getOrCreateByPath("/content/other/path/foo/oak-mount-libs-xyz/node2", 
"nt:folder", session);
+        
JcrUtils.getOrCreateByPath("/content/other/path/foo/oak-mount-apps-abc/node3", 
"nt:folder", session);
+        
JcrUtils.getOrCreateByPath("/content/other/path/foo/oak-mount-apps-abc/node4", 
"nt:folder", session);
         session.save();
     }
 
@@ -58,7 +61,8 @@ public class IncludeExcludeUpgradeTest e
             final RepositoryUpgrade upgrade = new RepositoryUpgrade(context, 
target);
             upgrade.setIncludes(
                     "/content/foo/en",
-                    "/content/assets/foo"
+                    "/content/assets/foo",
+                    "/content/other"
             );
             upgrade.setExcludes(
                     "/content/assets/foo/2013",
@@ -66,6 +70,12 @@ public class IncludeExcludeUpgradeTest e
                     "/content/assets/foo/2011",
                     "/content/assets/foo/2010"
             );
+            upgrade.setExcludeFragments(
+                    "oak-mount-libs-xyz"
+            );
+            upgrade.setFragmentPaths(
+                    "/content/other/path"
+            );
             upgrade.copy(null);
         } finally {
             context.getRepository().shutdown();
@@ -78,7 +88,9 @@ public class IncludeExcludeUpgradeTest e
                 "/content/foo/en",
                 "/content/assets/foo/2015/02",
                 "/content/assets/foo/2015/01",
-                "/content/assets/foo/2014"
+                "/content/assets/foo/2014",
+                "/content/other/path/foo/oak-mount-apps-abc/node3",
+                "/content/other/path/foo/oak-mount-apps-abc/node4"
         );
     }
 
@@ -97,7 +109,9 @@ public class IncludeExcludeUpgradeTest e
                 "/content/assets/foo/2013",
                 "/content/assets/foo/2012",
                 "/content/assets/foo/2011",
-                "/content/assets/foo/2010"
+                "/content/assets/foo/2010",
+                "/content/other/path/foo/oak-mount-libs-xyz/node1",
+                "/content/other/path/foo/oak-mount-libs-xyz/node2"
         );
     }
 }

Modified: 
jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepeatedRepositorySidegradeTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepeatedRepositorySidegradeTest.java?rev=1815885&r1=1815884&r2=1815885&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepeatedRepositorySidegradeTest.java
 (original)
+++ 
jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepeatedRepositorySidegradeTest.java
 Tue Nov 21 08:33:10 2017
@@ -23,18 +23,19 @@ import static org.apache.jackrabbit.oak.
 import java.io.File;
 import java.io.IOException;
 
-import javax.annotation.Nonnull;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 
 import org.apache.jackrabbit.oak.Oak;
+import org.apache.jackrabbit.oak.api.CommitFailedException;
 import org.apache.jackrabbit.oak.jcr.Jcr;
 import org.apache.jackrabbit.oak.jcr.repository.RepositoryImpl;
 import org.apache.jackrabbit.oak.segment.SegmentNodeStore;
 import org.apache.jackrabbit.oak.segment.SegmentNodeStoreBuilders;
 import org.apache.jackrabbit.oak.segment.file.FileStore;
 import org.apache.jackrabbit.oak.segment.file.InvalidFileStoreVersionException;
-import org.apache.jackrabbit.oak.spi.lifecycle.RepositoryInitializer;
+import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
+import org.apache.jackrabbit.oak.spi.commit.EmptyHook;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.apache.jackrabbit.oak.spi.state.NodeStore;
 import org.junit.Before;
@@ -63,7 +64,6 @@ public class RepeatedRepositorySidegrade
 
             final NodeStore target = getTargetNodeStore();
             doUpgradeRepository(sourceDir, target, false);
-            fileStore.flush();
 
             fileStore = fileStoreBuilder(sourceDir).build();
             segmentNodeStore = 
SegmentNodeStoreBuilders.builder(fileStore).build();
@@ -79,7 +79,6 @@ public class RepeatedRepositorySidegrade
             }
 
             doUpgradeRepository(sourceDir, target, true);
-            fileStore.flush();
 
             upgradeComplete = true;
         }
@@ -96,12 +95,14 @@ public class RepeatedRepositorySidegrade
         SegmentNodeStore segmentNodeStore = 
SegmentNodeStoreBuilders.builder(fileStore).build();
         try {
             final RepositorySidegrade repositoryUpgrade = new 
RepositorySidegrade(segmentNodeStore, target);
-            repositoryUpgrade.copy(new RepositoryInitializer() {
-                @Override
-                public void initialize(@Nonnull NodeBuilder builder) {
-                    builder.child("foo").child("bar");
-                }
-            });
+
+            NodeBuilder builder = target.getRoot().builder();
+            builder.child("foo").child("bar");
+            target.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY);
+
+            repositoryUpgrade.copy();
+        } catch (CommitFailedException e) {
+            throw new RepositoryException(e);
         } finally {
             fileStore.close();
         }

Modified: 
jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/AbstractOak2OakTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/AbstractOak2OakTest.java?rev=1815885&r1=1815884&r2=1815885&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/AbstractOak2OakTest.java
 (original)
+++ 
jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/AbstractOak2OakTest.java
 Tue Nov 21 08:33:10 2017
@@ -40,15 +40,14 @@ import javax.jcr.SimpleCredentials;
 import javax.jcr.Value;
 
 import com.google.common.base.Function;
-import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 import org.apache.commons.codec.digest.DigestUtils;
 import org.apache.jackrabbit.oak.api.Blob;
 import org.apache.jackrabbit.oak.api.CommitFailedException;
-import org.apache.jackrabbit.oak.api.Type;
 import org.apache.jackrabbit.oak.commons.IOUtils;
 import org.apache.jackrabbit.oak.jcr.Jcr;
 import org.apache.jackrabbit.oak.jcr.repository.RepositoryImpl;
+import org.apache.jackrabbit.oak.plugins.document.DocumentNodeState;
 import 
org.apache.jackrabbit.oak.plugins.index.reference.ReferenceIndexProvider;
 import org.apache.jackrabbit.oak.plugins.segment.SegmentNodeState;
 import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
@@ -59,7 +58,6 @@ import org.apache.jackrabbit.oak.spi.sta
 import org.apache.jackrabbit.oak.upgrade.RepositorySidegrade;
 import org.apache.jackrabbit.oak.upgrade.cli.container.NodeStoreContainer;
 import 
org.apache.jackrabbit.oak.upgrade.cli.container.SegmentNodeStoreContainer;
-import 
org.apache.jackrabbit.oak.upgrade.cli.container.SegmentTarNodeStoreContainer;
 import org.apache.jackrabbit.oak.upgrade.cli.parser.CliArgumentException;
 import org.junit.After;
 import org.junit.Before;
@@ -82,8 +80,6 @@ public abstract class AbstractOak2OakTes
 
     private RepositoryImpl repository;
 
-    private String checkpointReference;
-
     protected abstract NodeStoreContainer getSourceContainer();
 
     protected abstract NodeStoreContainer getDestinationContainer();
@@ -149,7 +145,7 @@ public abstract class AbstractOak2OakTes
         builder.setProperty("binary-prop", getRandomBlob(target));
         builder.setProperty("checkpoint-state", "before");
         target.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY);
-        checkpointReference = target.checkpoint(60000, singletonMap("key", 
"123"));
+        target.checkpoint(60000, singletonMap("key", "123"));
 
         builder.setProperty("checkpoint-state", "after");
         builder.setProperty("binary-prop", getRandomBlob(target));
@@ -219,6 +215,17 @@ public abstract class AbstractOak2OakTes
     protected void verifyCheckpoint() {
         assertEquals("after", 
destination.getRoot().getString("checkpoint-state"));
 
+        String checkpointReference = null;
+
+        for (String c : destination.checkpoints()) {
+            if (destination.checkpointInfo(c).containsKey("key")) {
+                checkpointReference = c;
+                break;
+            }
+        }
+
+        assertNotNull(checkpointReference);
+
         Map<String, String> info = 
destination.checkpointInfo(checkpointReference);
         assertEquals("123", info.get("key"));
 
@@ -244,6 +251,8 @@ public abstract class AbstractOak2OakTes
             return ((SegmentNodeState) node).getRecordId().toString();
         } else if (node instanceof 
org.apache.jackrabbit.oak.segment.SegmentNodeState) {
             return ((org.apache.jackrabbit.oak.segment.SegmentNodeState) 
node).getRecordId().toString();
+        } else if (node instanceof DocumentNodeState) {
+            return ((DocumentNodeState) node).getLastRevision().toString();
         } else {
             return null;
         }

Modified: 
jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/JdbcToSegmentTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/JdbcToSegmentTest.java?rev=1815885&r1=1815884&r2=1815885&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/JdbcToSegmentTest.java
 (original)
+++ 
jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/JdbcToSegmentTest.java
 Tue Nov 21 08:33:10 2017
@@ -48,4 +48,9 @@ public class JdbcToSegmentTest extends A
         return new String[] { "--src-user", "sa", "--src-password", "sa", 
source.getDescription(),
                 destination.getDescription() };
     }
+
+    @Override
+    protected boolean supportsCheckpointMigration() {
+        return true;
+    }
 }

Copied: 
jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/JdbcToSegmentWithMetadataTest.java
 (from r1815783, 
jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/JdbcToSegmentTest.java)
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/JdbcToSegmentWithMetadataTest.java?p2=jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/JdbcToSegmentWithMetadataTest.java&p1=jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/JdbcToSegmentTest.java&r1=1815783&r2=1815885&rev=1815885&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/JdbcToSegmentTest.java
 (original)
+++ 
jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/JdbcToSegmentWithMetadataTest.java
 Tue Nov 21 08:33:10 2017
@@ -16,19 +16,25 @@
  */
 package org.apache.jackrabbit.oak.upgrade.cli;
 
-import java.io.IOException;
-
 import org.apache.jackrabbit.oak.upgrade.cli.container.JdbcNodeStoreContainer;
 import org.apache.jackrabbit.oak.upgrade.cli.container.NodeStoreContainer;
 import 
org.apache.jackrabbit.oak.upgrade.cli.container.SegmentNodeStoreContainer;
+import org.junit.BeforeClass;
 
-public class JdbcToSegmentTest extends AbstractOak2OakTest {
+import java.io.IOException;
+
+public class JdbcToSegmentWithMetadataTest extends AbstractOak2OakTest {
 
     private final NodeStoreContainer source;
 
     private final NodeStoreContainer destination;
 
-    public JdbcToSegmentTest() throws IOException {
+    @BeforeClass
+    public static void setMetadataProperty() throws IOException {
+        System.setProperty("oak.upgrade.addSecondaryMetadata", "true");
+    }
+
+    public JdbcToSegmentWithMetadataTest() throws IOException {
         source = new JdbcNodeStoreContainer();
         destination = new SegmentNodeStoreContainer();
     }
@@ -48,4 +54,9 @@ public class JdbcToSegmentTest extends A
         return new String[] { "--src-user", "sa", "--src-password", "sa", 
source.getDescription(),
                 destination.getDescription() };
     }
+
+    @Override
+    protected boolean supportsCheckpointMigration() {
+        return true;
+    }
 }

Modified: 
jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/MongoToMongoFbsTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/MongoToMongoFbsTest.java?rev=1815885&r1=1815884&r2=1815885&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/MongoToMongoFbsTest.java
 (original)
+++ 
jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/MongoToMongoFbsTest.java
 Tue Nov 21 08:33:10 2017
@@ -59,4 +59,9 @@ public class MongoToMongoFbsTest extends
         return new String[] { "--copy-binaries", "--fileblobstore", 
destinationBlob.getDescription(),
                 source.getDescription(), destination.getDescription() };
     }
+
+    @Override
+    protected boolean supportsCheckpointMigration() {
+        return true;
+    }
 }

Modified: 
jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/MongoToMongoFdsTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/MongoToMongoFdsTest.java?rev=1815885&r1=1815884&r2=1815885&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/MongoToMongoFdsTest.java
 (original)
+++ 
jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/MongoToMongoFdsTest.java
 Tue Nov 21 08:33:10 2017
@@ -56,4 +56,9 @@ public class MongoToMongoFdsTest extends
         return new String[] { "--copy-binaries", "--datastore", 
destinationBlob.getDescription(),
                 source.getDescription(), destination.getDescription() };
     }
+
+    @Override
+    protected boolean supportsCheckpointMigration() {
+        return true;
+    }
 }

Modified: 
jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/MongoToSegmentTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/MongoToSegmentTest.java?rev=1815885&r1=1815884&r2=1815885&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/MongoToSegmentTest.java
 (original)
+++ 
jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/MongoToSegmentTest.java
 Tue Nov 21 08:33:10 2017
@@ -51,4 +51,9 @@ public class MongoToSegmentTest extends
     protected String[] getArgs() {
         return new String[] { source.getDescription(), 
destination.getDescription() };
     }
+
+    @Override
+    protected boolean supportsCheckpointMigration() {
+        return true;
+    }
 }

Modified: 
jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/SegmentToJdbcTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/SegmentToJdbcTest.java?rev=1815885&r1=1815884&r2=1815885&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/SegmentToJdbcTest.java
 (original)
+++ 
jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/SegmentToJdbcTest.java
 Tue Nov 21 08:33:10 2017
@@ -49,4 +49,9 @@ public class SegmentToJdbcTest extends A
         return new String[] { "--disable-mmap", "--user", "sa", "--password", 
"sa", source.getDescription(),
                 destination.getDescription() };
     }
+
+    @Override
+    protected boolean supportsCheckpointMigration() {
+        return true;
+    }
 }

Modified: 
jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/SegmentToMongoTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/SegmentToMongoTest.java?rev=1815885&r1=1815884&r2=1815885&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/SegmentToMongoTest.java
 (original)
+++ 
jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/SegmentToMongoTest.java
 Tue Nov 21 08:33:10 2017
@@ -51,4 +51,9 @@ public class SegmentToMongoTest extends
     protected String[] getArgs() {
         return new String[] { source.getDescription(), 
destination.getDescription() };
     }
+
+    @Override
+    protected boolean supportsCheckpointMigration() {
+        return true;
+    }
 }

Modified: 
jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/blob/FbsToS3Test.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/blob/FbsToS3Test.java?rev=1815885&r1=1815884&r2=1815885&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/blob/FbsToS3Test.java
 (original)
+++ 
jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/blob/FbsToS3Test.java
 Tue Nov 21 08:33:10 2017
@@ -39,7 +39,7 @@ public class FbsToS3Test extends Abstrac
     private final NodeStoreContainer destination;
 
     public FbsToS3Test() throws IOException {
-        Assume.assumeTrue(S3_PROPERTIES != null);
+        Assume.assumeTrue(S3_PROPERTIES != null && !S3_PROPERTIES.isEmpty());
         sourceBlob = new FileBlobStoreContainer();
         destinationBlob = new S3DataStoreContainer(S3_PROPERTIES);
         source = new SegmentTarNodeStoreContainer(sourceBlob);

Modified: 
jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/blob/S3ToFbsTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/blob/S3ToFbsTest.java?rev=1815885&r1=1815884&r2=1815885&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/blob/S3ToFbsTest.java
 (original)
+++ 
jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/blob/S3ToFbsTest.java
 Tue Nov 21 08:33:10 2017
@@ -39,7 +39,7 @@ public class S3ToFbsTest extends Abstrac
     private final NodeStoreContainer destination;
 
     public S3ToFbsTest() throws IOException {
-        Assume.assumeTrue(S3_PROPERTIES != null);
+        Assume.assumeTrue(S3_PROPERTIES != null && !S3_PROPERTIES.isEmpty());
         sourceBlob = new S3DataStoreContainer(S3_PROPERTIES);
         destinationBlob = new FileBlobStoreContainer();
         source = new SegmentTarNodeStoreContainer(sourceBlob);

Modified: 
jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/container/SegmentTarNodeStoreContainer.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/container/SegmentTarNodeStoreContainer.java?rev=1815885&r1=1815884&r2=1815885&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/container/SegmentTarNodeStoreContainer.java
 (original)
+++ 
jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/container/SegmentTarNodeStoreContainer.java
 Tue Nov 21 08:33:10 2017
@@ -103,6 +103,9 @@ public class SegmentTarNodeStoreContaine
     }
 
     public static void deleteRecursive(File directory) {
+        if (!directory.exists()) {
+            return;
+        }
         try {
             Files.walkFileTree(directory.toPath(), new 
SimpleFileVisitor<Path>() {
                 @Override

Modified: 
jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/nodestate/FilteringNodeStateTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/nodestate/FilteringNodeStateTest.java?rev=1815885&r1=1815884&r2=1815885&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/nodestate/FilteringNodeStateTest.java
 (original)
+++ 
jackrabbit/oak/branches/1.6/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/nodestate/FilteringNodeStateTest.java
 Tue Nov 21 08:33:10 2017
@@ -16,6 +16,21 @@
  */
 package org.apache.jackrabbit.oak.upgrade.nodestate;
 
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
+import org.apache.jackrabbit.oak.api.CommitFailedException;
+import org.apache.jackrabbit.oak.api.PropertyState;
+import org.apache.jackrabbit.oak.api.Type;
+import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
+import org.apache.jackrabbit.oak.spi.state.NodeStore;
+import org.junit.Before;
+import org.junit.Test;
+
+import javax.jcr.RepositoryException;
+import java.io.IOException;
+import java.util.Set;
+
 import static com.google.common.collect.ImmutableSet.of;
 import static com.google.common.collect.Lists.newArrayList;
 import static java.util.Arrays.asList;
@@ -36,22 +51,6 @@ import static org.junit.Assert.assertNul
 import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
 
-import java.io.IOException;
-import java.util.Set;
-
-import javax.jcr.RepositoryException;
-
-import com.google.common.base.Predicate;
-import com.google.common.collect.Iterables;
-import org.apache.jackrabbit.oak.api.CommitFailedException;
-import org.apache.jackrabbit.oak.api.PropertyState;
-import org.apache.jackrabbit.oak.api.Type;
-import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
-import org.apache.jackrabbit.oak.spi.state.NodeState;
-import org.apache.jackrabbit.oak.spi.state.NodeStore;
-import org.junit.Before;
-import org.junit.Test;
-
 public class FilteringNodeStateTest {
 
     private static final Set<String> DEFAULT_INCLUDES = FilteringNodeState.ALL;
@@ -80,46 +79,46 @@ public class FilteringNodeStateTest {
 
     @Test
     public void shouldNotDecorateForNullArgs() {
-        final NodeState decorated = wrap("/", rootNodeState, null, null);
+        final NodeState decorated = wrap("/", rootNodeState, null, null, null, 
null);
         assertSame("root should be identical to decorated", rootNodeState, 
decorated);
     }
 
     @Test
     public void shouldNotDecorateForDefaultIncludes() {
-        final NodeState decorated = wrap("/", rootNodeState, DEFAULT_INCLUDES, 
null);
+        final NodeState decorated = wrap("/", rootNodeState, DEFAULT_INCLUDES, 
null, null, null);
         assertSame("root should be identical to decorated", rootNodeState, 
decorated);
     }
 
     @Test
     public void shouldNotDecorateForDefaultExcludes() {
-        final NodeState decorated = wrap("/", rootNodeState, null, 
DEFAULT_EXCLUDES);
+        final NodeState decorated = wrap("/", rootNodeState, null, 
DEFAULT_EXCLUDES, null, null);
         assertSame("root should be identical to decorated", rootNodeState, 
decorated);
     }
 
     @Test
     public void shouldNotDecorateForDefaultIncludesAndExcludes() {
-        final NodeState decorated = wrap("/", rootNodeState, DEFAULT_INCLUDES, 
DEFAULT_EXCLUDES);
+        final NodeState decorated = wrap("/", rootNodeState, DEFAULT_INCLUDES, 
DEFAULT_EXCLUDES, null, null);
         assertSame("root should be identical to decorated", rootNodeState, 
decorated);
     }
 
     @Test
     public void shouldNotDecorateIncludedPath() {
         final NodeState content = getNodeState(rootNodeState, "/content");
-        final NodeState decorated = wrap("/content", content, of("/content"), 
null);
+        final NodeState decorated = wrap("/content", content, of("/content"), 
null, null, null);
         assertSame("content should be identical to decorated", content, 
decorated);
     }
 
     @Test
     public void shouldNotDecorateIncludedDescendants() {
         final NodeState foo = getNodeState(rootNodeState, "/content/foo");
-        final NodeState decorated = wrap("/content/foo", foo, of("/content"), 
null);
+        final NodeState decorated = wrap("/content/foo", foo, of("/content"), 
null, null, null);
         assertSame("foo should be identical to decorated", foo, decorated);
     }
 
     @Test
     public void shouldDecorateAncestorOfExcludedDescendants() {
         final NodeState foo = getNodeState(rootNodeState, "/content/foo");
-        final NodeState decorated = wrap("/content/foo", foo, of("/content"), 
of("/content/foo/de"));
+        final NodeState decorated = wrap("/content/foo", foo, of("/content"), 
of("/content/foo/de"), null, null);
         assertNotSame("foo should not be identical to decorated", foo, 
decorated);
 
         assertMissing(decorated, "de");
@@ -135,7 +134,7 @@ public class FilteringNodeStateTest {
     @Test
     public void shouldHaveCorrectChildOrderProperty() throws 
CommitFailedException {
         final NodeState content = rootNodeState.getChildNode("content");
-        final NodeState decorated = wrap("/content", content, null, 
of("/content/foo"));
+        final NodeState decorated = wrap("/content", content, null, 
of("/content/foo"), null, null);
 
         assertTrue(decorated.hasProperty(OAK_CHILD_ORDER));
 
@@ -160,7 +159,7 @@ public class FilteringNodeStateTest {
 
     @Test
     public void shouldDecorateExcludedNode() {
-        final NodeState decoratedRoot = wrap("/", rootNodeState, 
of("/content"), of("/content/foo/de"));
+        final NodeState decoratedRoot = wrap("/", rootNodeState, 
of("/content"), of("/content/foo/de"), null, null);
         final NodeState de = getNodeState(rootNodeState, "/content/foo/de");
         final NodeState decorated = getNodeState(decoratedRoot, 
"/content/foo/de");
         assertFalse("de should not be equal to decorated", 
de.equals(decorated));
@@ -170,14 +169,14 @@ public class FilteringNodeStateTest {
     @Test
     public void shouldDecorateImplicitlyExcludedNode() {
         final NodeState content = getNodeState(rootNodeState, "/content");
-        final NodeState decorated = wrap("/content", content, of("/apps"), 
null);
+        final NodeState decorated = wrap("/content", content, of("/apps"), 
null, null, null);
         assertNotSame("content should not be identical to decorated", content, 
decorated);
     }
 
 
     @Test
     public void shouldHideExcludedPathsViaExists() {
-        final NodeState decorated = wrap("/", rootNodeState, null, of("/apps", 
"/libs"));
+        final NodeState decorated = wrap("/", rootNodeState, null, of("/apps", 
"/libs"), null, null);
         assertMissing(decorated, "apps");
         assertMissing(decorated, "libs/foo/install");
 
@@ -187,7 +186,7 @@ public class FilteringNodeStateTest {
 
     @Test
     public void shouldHideExcludedPathsViaHasChildNode() {
-        final NodeState decorated = wrap("/", rootNodeState, null, of("/apps", 
"/libs"));
+        final NodeState decorated = wrap("/", rootNodeState, null, of("/apps", 
"/libs"), null, null);
 
         assertExistingHasChildNode(decorated, "content");
         assertMissingHasChildNode(decorated, "apps");
@@ -196,7 +195,7 @@ public class FilteringNodeStateTest {
 
     @Test
     public void shouldHideExcludedPathsViaGetChildNodeNames() {
-        final NodeState decorated = wrap("/", rootNodeState, null, of("/apps", 
"/libs"));
+        final NodeState decorated = wrap("/", rootNodeState, null, of("/apps", 
"/libs"), null, null);
 
         assertExistingChildNodeName(decorated, "content");
         assertMissingChildNodeName(decorated, "apps");
@@ -205,7 +204,7 @@ public class FilteringNodeStateTest {
 
     @Test
     public void shouldHideMissingIncludedPathsViaExists() {
-        final NodeState decorated = wrap("/", rootNodeState, of("/content"), 
null);
+        final NodeState decorated = wrap("/", rootNodeState, of("/content"), 
null, null, null);
         assertMissing(decorated, "apps");
         assertMissing(decorated, "libs/foo/install");
 
@@ -215,7 +214,7 @@ public class FilteringNodeStateTest {
 
     @Test
     public void shouldHideMissingIncludedPathsViaHasChildNode() {
-        final NodeState decorated = wrap("/", rootNodeState, of("/content"), 
null);
+        final NodeState decorated = wrap("/", rootNodeState, of("/content"), 
null, null, null);
 
         assertExistingHasChildNode(decorated, "content");
         assertMissingHasChildNode(decorated, "apps");
@@ -224,7 +223,7 @@ public class FilteringNodeStateTest {
 
     @Test
     public void shouldHideMissingIncludedPathsViaGetChildNodeNames() {
-        final NodeState decorated = wrap("/", rootNodeState, of("/content"), 
null);
+        final NodeState decorated = wrap("/", rootNodeState, of("/content"), 
null, null, null);
 
         assertExistingChildNodeName(decorated, "content");
         assertMissingChildNodeName(decorated, "apps");
@@ -233,15 +232,15 @@ public class FilteringNodeStateTest {
 
     @Test
     public void shouldGivePrecedenceForExcludesOverIncludes() {
-        final NodeState conflictingRules = wrap("/", rootNodeState, 
of("/content"), of("/content"));
+        final NodeState conflictingRules = wrap("/", rootNodeState, 
of("/content"), of("/content"), null, null);
         assertMissingChildNodeName(conflictingRules, "content");
 
-        final NodeState overlappingRules = wrap("/", rootNodeState, 
of("/content"), of("/content/foo"));
+        final NodeState overlappingRules = wrap("/", rootNodeState, 
of("/content"), of("/content/foo"), null, null);
         assertExistingChildNodeName(overlappingRules, "content");
         assertMissingChildNodeName(overlappingRules.getChildNode("content"), 
"foo");
 
 
-        final NodeState overlappingRules2 = wrap("/", rootNodeState, 
of("/content/foo"), of("/content"));
+        final NodeState overlappingRules2 = wrap("/", rootNodeState, 
of("/content/foo"), of("/content"), null, null);
         assertMissingChildNodeName(overlappingRules2, "content");
         assertMissingChildNodeName(overlappingRules2.getChildNode("content"), 
"foo");
 
@@ -249,7 +248,7 @@ public class FilteringNodeStateTest {
 
     @Test
     public void shouldRespectPathBoundariesForIncludes() {
-        final NodeState decorated = wrap("/", rootNodeState, 
of("/content/foo"), null);
+        final NodeState decorated = wrap("/", rootNodeState, 
of("/content/foo"), null, null, null);
 
         assertExistingChildNodeName(decorated, "content");
         assertExistingChildNodeName(decorated.getChildNode("content"), "foo");
@@ -258,7 +257,7 @@ public class FilteringNodeStateTest {
 
     @Test
     public void shouldRespectPathBoundariesForExcludes() {
-        final NodeState decorated = wrap("/", rootNodeState, null, 
of("/content/foo"));
+        final NodeState decorated = wrap("/", rootNodeState, null, 
of("/content/foo"), null, null);
 
         assertExistingChildNodeName(decorated, "content");
         assertMissingChildNodeName(decorated.getChildNode("content"), "foo");
@@ -267,7 +266,7 @@ public class FilteringNodeStateTest {
 
     @Test
     public void shouldDelegatePropertyCount() {
-        final NodeState decorated = wrap("/", rootNodeState, null, 
of("/content/foo/de"));
+        final NodeState decorated = wrap("/", rootNodeState, null, 
of("/content/foo/de"), null, null);
 
         assertEquals(1, getNodeState(decorated, 
"/content").getPropertyCount());
         assertEquals(0, getNodeState(decorated, 
"/content/foo").getPropertyCount());
@@ -276,7 +275,7 @@ public class FilteringNodeStateTest {
 
     @Test
     public void shouldDelegateGetProperty() {
-        final NodeState decorated = wrap("/", rootNodeState, null, 
of("/content/foo"));
+        final NodeState decorated = wrap("/", rootNodeState, null, 
of("/content/foo"), null, null);
         final NodeState content = getNodeState(decorated, "/content");
 
         assertNotNull(content.getProperty(OAK_CHILD_ORDER));
@@ -286,7 +285,7 @@ public class FilteringNodeStateTest {
 
     @Test
     public void shouldDelegateHasProperty() {
-        final NodeState decorated = wrap("/", rootNodeState, null, 
of("/content/foo/de"));
+        final NodeState decorated = wrap("/", rootNodeState, null, 
of("/content/foo/de"), null, null);
 
         assertTrue(getNodeState(decorated, 
"/content").hasProperty(OAK_CHILD_ORDER));
         assertFalse(getNodeState(decorated, "/content").hasProperty("foo"));
@@ -295,7 +294,7 @@ public class FilteringNodeStateTest {
 
     @Test
     public void exists() {
-        final NodeState decorated = wrap("/", rootNodeState, null, 
of("/content/foo"));
+        final NodeState decorated = wrap("/", rootNodeState, null, 
of("/content/foo"), null, null);
         assertTrue("/content should exist and be visible", 
getNodeState(decorated, "/content").exists());
         assertFalse("/content/foo should be hidden", getNodeState(decorated, 
"/content/foo").exists());
         assertFalse("/nonexisting should not exist", getNodeState(decorated, 
"/nonexisting").exists());


Reply via email to