mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-08-01 13:25:45 +02:00
Bug 520257: Avoid touching file with unchanged content
When creating the settings.xml, avoid writing to the file unless the contents have actually changed. This avoids a resource delta that caused unneeded rebuilds. Change-Id: I83cea84e96d006f99a1c264f283d4bba4ad68784
This commit is contained in:
parent
594e65c8c0
commit
7f3b2120fe
1 changed files with 29 additions and 2 deletions
|
@ -19,6 +19,7 @@ import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.UnsupportedEncodingException;
|
import java.io.UnsupportedEncodingException;
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
import javax.xml.parsers.DocumentBuilder;
|
import javax.xml.parsers.DocumentBuilder;
|
||||||
import javax.xml.parsers.DocumentBuilderFactory;
|
import javax.xml.parsers.DocumentBuilderFactory;
|
||||||
|
@ -384,10 +385,14 @@ public class XmlUtil {
|
||||||
String utfString = new String(toByteArray(doc), ENCODING_UTF_8);
|
String utfString = new String(toByteArray(doc), ENCODING_UTF_8);
|
||||||
String lineSeparator = Util.getLineSeparator(file);
|
String lineSeparator = Util.getLineSeparator(file);
|
||||||
utfString = XmlUtil.replaceLineSeparatorInternal(utfString, lineSeparator);
|
utfString = XmlUtil.replaceLineSeparatorInternal(utfString, lineSeparator);
|
||||||
InputStream input = new ByteArrayInputStream(utfString.getBytes(ENCODING_UTF_8));
|
byte[] newContents = utfString.getBytes(ENCODING_UTF_8);
|
||||||
|
InputStream input = new ByteArrayInputStream(newContents);
|
||||||
|
|
||||||
if (file.exists()) {
|
if (file.exists()) {
|
||||||
file.setContents(input, IResource.FORCE, null);
|
byte[] existingContents = readFile(file);
|
||||||
|
if (!Arrays.equals(existingContents, newContents)) {
|
||||||
|
file.setContents(input, IResource.FORCE, null);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
file.create(input, IResource.FORCE, null);
|
file.create(input, IResource.FORCE, null);
|
||||||
}
|
}
|
||||||
|
@ -395,6 +400,28 @@ public class XmlUtil {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read whole file, returning null on any error.
|
||||||
|
*/
|
||||||
|
private static byte[] readFile(IFile file) {
|
||||||
|
try (InputStream is = file.getContents(true)) {
|
||||||
|
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
|
||||||
|
|
||||||
|
int nRead;
|
||||||
|
byte[] data = new byte[4096];
|
||||||
|
|
||||||
|
while ((nRead = is.read(data)) != -1) {
|
||||||
|
buffer.write(data, 0, nRead);
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer.flush();
|
||||||
|
|
||||||
|
return buffer.toByteArray();
|
||||||
|
} catch (IOException | CoreException e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Serialize XML Document into a string.
|
* Serialize XML Document into a string.
|
||||||
*
|
*
|
||||||
|
|
Loading…
Add table
Reference in a new issue