code: private static String computeTargetPath(String path, String source, String destination)
        throws Exception {
      String relativePath = PathUtils.subtractPaths(path, source);
      return PathUtils.concatPath(destination, relativePath);
    }
docs: Computes the path that the given path should end up at when source is migrated to destination.
  
  @param path a path to migrate which must be a descendent path of the source path,
  e.g. /src/file
  @param source the base source path being migrated, e.g. /src
  @param destination the path to migrate to, e.g. /dst/src
  @return the path which file should be migrated to, e.g. /dst/src/file