diff options
author | Thomas Wolf | 2021-09-02 22:17:46 +0000 |
---|---|---|
committer | Thomas Wolf | 2021-11-04 21:21:11 +0000 |
commit | 48579213f42d7cab5914daec64c25f0d4aef8ed7 (patch) | |
tree | e4540c3eaeb9fd3b879755dcfc49134c7c38a6f8 | |
parent | 3587dbc27d5f4a62fae21b702afebbf1cce09e87 (diff) | |
download | egit-48579213f42d7cab5914daec64c25f0d4aef8ed7.tar.gz egit-48579213f42d7cab5914daec64c25f0d4aef8ed7.tar.xz egit-48579213f42d7cab5914daec64c25f0d4aef8ed7.zip |
Don't rely on an implicit default character set
JEP 400 (Java 18) will change the default character set to UTF-8
unconditionally.[1] EGit has two places where it used the default
character set implicitly, and two where it used it explicitly.
Change all four locations to use SystemReader.getDefaultCharset(),
which gets the locale-dependent charset the way JEP 400 recommends.
[1] https://openjdk.java.net/jeps/400
Change-Id: I0d16916d2ed5a91fa27f23357dfc15306b65d132
Signed-off-by: Thomas Wolf <thomas.wolf@paranor.ch>
3 files changed, 27 insertions, 9 deletions
diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/signing/ExternalGpgSigner.java b/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/signing/ExternalGpgSigner.java index 49790c8d08..d565d64047 100644 --- a/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/signing/ExternalGpgSigner.java +++ b/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/signing/ExternalGpgSigner.java @@ -16,7 +16,6 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; -import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.text.MessageFormat; import java.util.Arrays; @@ -160,7 +159,7 @@ public class ExternalGpgSigner extends GpgSigner implements GpgObjectSigner { if (b != null) { try { return new String(b.toByteArray(4000), - Charset.defaultCharset()); + SystemReader.getInstance().getDefaultCharset()); } catch (IOException e) { Activator.logWarning(CoreText.ExternalGpgSigner_bufferError, e); } @@ -459,7 +458,8 @@ public class ExternalGpgSigner extends GpgSigner implements GpgObjectSigner { runProcess(process, null, b -> { try (BufferedReader r = new BufferedReader( new InputStreamReader(b.openInputStream(), - Charset.defaultCharset()))) { + SystemReader.getInstance() + .getDefaultCharset()))) { result[0] = r.readLine(); } }, null); diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/op/CreatePatchOperation.java b/org.eclipse.egit.core/src/org/eclipse/egit/core/op/CreatePatchOperation.java index e65826a8de..2d3d522c08 100644 --- a/org.eclipse.egit.core/src/org/eclipse/egit/core/op/CreatePatchOperation.java +++ b/org.eclipse.egit.core/src/org/eclipse/egit/core/op/CreatePatchOperation.java @@ -59,6 +59,7 @@ import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.treewalk.FileTreeIterator; import org.eclipse.jgit.treewalk.filter.TreeFilter; +import org.eclipse.jgit.util.SystemReader; import org.eclipse.osgi.util.NLS; /** @@ -254,12 +255,28 @@ public class CreatePatchOperation implements IEGitOperation { private void appendOutputStream(final StringBuilder sb, final ByteArrayOutputStream outputStream) { + String encoding = currentEncoding != null ? currentEncoding + : UTF_8.name(); try { - String encoding = currentEncoding != null ? currentEncoding - : UTF_8.name(); sb.append(outputStream.toString(encoding)); } catch (UnsupportedEncodingException e) { - sb.append(outputStream.toString()); + // Can only happen if encoding != UTF-8 + String defaultCharset = SystemReader.getInstance() + .getDefaultCharset().name(); + try { + if (!encoding.equals(defaultCharset)) { + sb.append(outputStream.toString(defaultCharset)); + return; + } + } catch (UnsupportedEncodingException ignored) { + // What? The locale charset is also not known? Fall back to + // UTF-8. + } + try { + sb.append(outputStream.toString(UTF_8.name())); + } catch (UnsupportedEncodingException cannotOccur) { + // Known not to happen. + } } } diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/revision/EditableRevision.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/revision/EditableRevision.java index 5e66f0229c..3c36b2c4c5 100644 --- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/revision/EditableRevision.java +++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/revision/EditableRevision.java @@ -32,6 +32,7 @@ import org.eclipse.egit.ui.Activator; import org.eclipse.egit.ui.internal.UIText; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.text.IDocument; +import org.eclipse.jgit.util.SystemReader; import org.eclipse.swt.widgets.Display; import org.eclipse.team.core.history.IFileRevision; import org.eclipse.ui.IEditorInput; @@ -221,10 +222,10 @@ public class EditableRevision extends FileRevisionTypedElement implements try { String charset = editable.getCharset(); if (charset == null) { - editable.setContent(document.get().getBytes()); - } else { - editable.setContent(document.get().getBytes(charset)); + charset = SystemReader.getInstance().getDefaultCharset() + .name(); } + editable.setContent(document.get().getBytes(charset)); // We _know_ that the document provider _cannot_ really save // the IStorage. Nevertheless calling its save operation is // necessary because otherwise an internal "modified" flag |