testSrc/org/jetbrains/jps/util/FileUtil.groovy (128 lines of code) (raw):
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.jps.util
/**
* @author nik
*/
class FileUtil {
private static Set<String> IGNORED = [/*"MANIFEST.MF", "META-INF"*/] as Set
private static Set<String> IGNORED_TEXT_DIFFS = ["MANIFEST.MF"] as Set
static String loadFileText(File file) throws IOException{
InputStream stream = new FileInputStream(file);
Reader reader = new InputStreamReader(stream);
try{
return new String(loadText(reader, (int)file.length()));
}
finally{
reader.close();
}
}
static char[] loadText(Reader reader, int length) throws IOException {
char[] chars = new char[length];
int count = 0;
while (count < chars.length) {
int n = reader.read(chars, count, chars.length - count);
if (n <= 0) break;
count += n;
}
if (count == chars.length){
return chars;
}
else{
char[] newChars = new char[count];
System.arraycopy(chars, 0, newChars, 0, count);
return newChars;
}
}
static boolean createParentDirs(File file) {
if (!file.exists()) {
String parentDirPath = file.getParent()
if (parentDirPath != null) {
final File parentFile = new File(parentDirPath)
return parentFile.exists() && parentFile.isDirectory() || parentFile.mkdirs()
}
}
return false
}
static boolean delete(File file){
File[] files = file.listFiles();
if (files != null) {
for (File file1 : files) {
if (!delete(file1)) return false;
}
}
for (int i = 0; i < 10; i++){
if (file.delete() || !file.exists()) return true;
try {
Thread.sleep(10);
}
catch (InterruptedException ignored) {
}
}
return false;
}
static def compareFiles(File file1, File file2, String relativePath) {
int processed
def name = file1.name
if (name.endsWith(".jar") || name.endsWith(".war") || name.endsWith(".zip")) {
def dir1 = ZipUtil.extractToTempDir(file1)
def dir2 = ZipUtil.extractToTempDir(file2)
processed = compareDirectories(dir1, dir2, relativePath)
delete(dir1)
delete(dir2)
}
else {
def len1 = file1.length()
def len2 = file2.length()
if (len1 != len2 && !IGNORED_TEXT_DIFFS.contains(file1.name)) {
System.out.println("file length mismatch for $relativePath: #1.len=$len1, #2.len=$len2");
}
processed = 1
}
return processed
}
static def compareDirectories(File dir1, File dir2) {
if (!dir1.exists()) {
System.out.println("${dir1.absolutePath} doesn't exist");
return
}
if (!dir2.exists()) {
System.out.println("${dir2.absolutePath} doesn't exist");
return
}
System.out.println("Comparing ${dir1.absolutePath}(#1) and ${dir2.absolutePath}(#2)...");
def files = compareDirectories(dir1, dir2, "")
System.out.println("$files files processed.");
}
private static int compareDirectories(File dir1, File dir2, String relativePath) {
def processed = 0
Set<String> dir2Files = dir2.listFiles()*.name as Set
dir1.listFiles().each {File child1 ->
File child2 = new File(dir2, child1.name)
if (!child2.exists()) {
if (!IGNORED.contains(child1.name)) {
System.out.println("#1: $relativePath/${child1.name}");
}
}
else {
if (child1.isFile() && child2.isFile()) {
processed += compareFiles(child1, child2, relativePath + "/" + child1.name)
}
else if (child1.isDirectory() && child2.isDirectory()) {
processed += compareDirectories(child1, child2, relativePath + "/" + child1.name)
}
else {
System.out.println("type mismatch for $relativePath: #1 is ${child1.isDirectory() ? "dir" : "file"}, #2 is ${child2.isDirectory() ? "dir" : "file"}");
}
}
dir2Files.remove(child1.name)
}
dir2Files.each {
if (!IGNORED.contains(it)) {
System.out.println("#2: $relativePath/$it");
}
}
return processed
}
static File createTempDirectory(String prefix) {
def output = File.createTempFile(prefix, "tmp")
output.delete()
output.mkdirs()
return output
}
}