public static DirDiff getQuickDiff(DirRequest request) { // Get a listing of files from both directories using the exact same includes/excludes List<File> sourceFiles = getFiles(request.getSourceDir(), request.getIncludes(), request.getExcludes()); List<File> targetFiles = getFiles(request.getTargetDir(), request.getIncludes(), request.getExcludes()); // Get the unique set of paths for each file relative to their parent directory Set<String> sourcePaths = new HashSet<String>(getRelativePaths(request.getSourceDir(), sourceFiles)); Set<String> targetPaths = new HashSet<String>(getRelativePaths(request.getTargetDir(), targetFiles)); // Paths that exist in both directories Set<String> both = SetUtils.intersection(sourcePaths, targetPaths); // Paths that exist in source but not target Set<String> sourceOnly = SetUtils.difference(sourcePaths, targetPaths); // Paths that exist in target but not source Set<String> targetOnly = SetUtils.difference(targetPaths, sourcePaths); logger.debug("source={}, sourceOnly.size()={}", request.getSourceDir(), sourceOnly.size()); logger.debug("target={}, targetOnly.size()={}", request.getTargetDir(), targetOnly.size()); // Store the information we've collected into a result object DirDiff result = new DirDiff(request.getSourceDir(), request.getTargetDir()); // Store the relative paths on the diff object result.setBoth(new ArrayList<String>(both)); result.setSourceDirOnly(new ArrayList<String>(sourceOnly)); result.setTargetDirOnly(new ArrayList<String>(targetOnly)); // Sort the relative paths Collections.sort(result.getBoth()); Collections.sort(result.getSourceDirOnly()); Collections.sort(result.getTargetDirOnly()); // return the diff return result; }
public static SyncResult syncFiles(SyncRequest request) throws IOException { logger.info("Sync [{}] -> [{}]", request.getSrcDir(), request.getDstDir()); List<File> dstFiles = getAllNonScmFiles(request.getDstDir()); List<File> srcFiles = request.getSrcFiles(); List<String> dstPaths = getRelativePaths(request.getDstDir(), dstFiles); List<String> srcPaths = getRelativePaths(request.getSrcDir(), srcFiles); List<String> adds = new ArrayList<String>(); List<String> updates = new ArrayList<String>(); List<String> deletes = new ArrayList<String>(); for (String srcPath : srcPaths) { boolean existing = dstPaths.contains(srcPath); if (existing) { updates.add(srcPath); } else { adds.add(srcPath); } } for (String dstPath : dstPaths) { boolean extra = !srcPaths.contains(dstPath); if (extra) { deletes.add(dstPath); } } copyFiles(request.getSrcDir(), request.getSrcFiles(), request.getDstDir()); SyncResult result = new SyncResult(); result.setAdds(getFullPaths(request.getDstDir(), adds)); result.setUpdates(getFullPaths(request.getDstDir(), updates)); result.setDeletes(getFullPaths(request.getDstDir(), deletes)); return result; }