Compatibility with jgit 5.4.2

Change-Id: Ic1fabd9bad94e5ef6634d5fa6176744ec4b1ae7b
diff --git a/plugins/org.eclipse.emf.compare.ide.ui.tests.git/.classpath b/plugins/org.eclipse.emf.compare.ide.ui.tests.git/.classpath
index 098194c..eca7bdb 100644
--- a/plugins/org.eclipse.emf.compare.ide.ui.tests.git/.classpath
+++ b/plugins/org.eclipse.emf.compare.ide.ui.tests.git/.classpath
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
 	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
 	<classpathentry kind="src" path="src"/>
 	<classpathentry kind="output" path="bin"/>
diff --git a/plugins/org.eclipse.emf.compare.ide.ui.tests.git/.settings/org.eclipse.jdt.core.prefs b/plugins/org.eclipse.emf.compare.ide.ui.tests.git/.settings/org.eclipse.jdt.core.prefs
index 79ea86f..75adc0e 100644
--- a/plugins/org.eclipse.emf.compare.ide.ui.tests.git/.settings/org.eclipse.jdt.core.prefs
+++ b/plugins/org.eclipse.emf.compare.ide.ui.tests.git/.settings/org.eclipse.jdt.core.prefs
@@ -8,9 +8,9 @@
 org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
 org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.7
+org.eclipse.jdt.core.compiler.compliance=1.8
 org.eclipse.jdt.core.compiler.debug.lineNumber=generate
 org.eclipse.jdt.core.compiler.debug.localVariable=generate
 org.eclipse.jdt.core.compiler.debug.sourceFile=generate
@@ -101,7 +101,7 @@
 org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
 org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.7
+org.eclipse.jdt.core.compiler.source=1.8
 org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
diff --git a/plugins/org.eclipse.emf.compare.ide.ui.tests.git/META-INF/MANIFEST.MF b/plugins/org.eclipse.emf.compare.ide.ui.tests.git/META-INF/MANIFEST.MF
index 3cbb014..a677d57 100644
--- a/plugins/org.eclipse.emf.compare.ide.ui.tests.git/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.emf.compare.ide.ui.tests.git/META-INF/MANIFEST.MF
@@ -6,7 +6,7 @@
 Bundle-Localization: plugin
 Bundle-Vendor: %providerName
 Fragment-Host: org.eclipse.emf.compare.ide.ui.tests
-Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Require-Bundle: org.eclipse.egit.core;bundle-version="4.2.0",
  org.eclipse.jgit;bundle-version="4.2.0",
  org.eclipse.emf.compare.egit;bundle-version="1.1.0",
diff --git a/plugins/org.eclipse.emf.compare.ide.ui.tests.git/src/org/eclipse/emf/compare/ide/ui/tests/egit/fixture/MockSystemReader.java b/plugins/org.eclipse.emf.compare.ide.ui.tests.git/src/org/eclipse/emf/compare/ide/ui/tests/egit/fixture/MockSystemReader.java
index 78f2c53..0dfe88b 100644
--- a/plugins/org.eclipse.emf.compare.ide.ui.tests.git/src/org/eclipse/emf/compare/ide/ui/tests/egit/fixture/MockSystemReader.java
+++ b/plugins/org.eclipse.emf.compare.ide.ui.tests.git/src/org/eclipse/emf/compare/ide/ui/tests/egit/fixture/MockSystemReader.java
@@ -47,26 +47,32 @@
 
 import java.io.File;
 import java.io.IOException;
+import java.lang.reflect.Field;
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
+import java.time.Duration;
 import java.util.HashMap;
 import java.util.Locale;
 import java.util.Map;
 import java.util.TimeZone;
+import java.util.concurrent.TimeUnit;
 
 import org.eclipse.jgit.errors.ConfigInvalidException;
 import org.eclipse.jgit.lib.Config;
 import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.StoredConfig;
 import org.eclipse.jgit.storage.file.FileBasedConfig;
 import org.eclipse.jgit.util.FS;
 import org.eclipse.jgit.util.SystemReader;
+import org.eclipse.jgit.util.time.MonotonicClock;
+import org.eclipse.jgit.util.time.ProposedTimestamp;
 
 /**
  * Except for this comment, verbatim copy/paste of org.eclipse.jgit.junit.MockSystemReader.
  */
 @SuppressWarnings("nls")
 public class MockSystemReader extends SystemReader {
-	private final class MockConfig extends FileBasedConfig {
+	private static final class MockConfig extends FileBasedConfig {
 		private MockConfig(File cfgLocation, FS fs) {
 			super(cfgLocation, fs);
 		}
@@ -77,92 +83,193 @@
 		}
 
 		@Override
+		public void save() throws IOException {
+			// Do nothing
+		}
+
+		@Override
 		public boolean isOutdated() {
 			return false;
 		}
+
+		@Override
+		public String toString() {
+			return "MockConfig";
+		}
 	}
 
-	final Map<String, String> values = new HashMap<String, String>();
+	long now = 1250379778668L; // Sat Aug 15 20:12:58 GMT-03:30 2009
 
-	FileBasedConfig userGitConfig;
+	final Map<String, String> values = new HashMap<>();
+
+	private FileBasedConfig userGitConfig;
 
 	FileBasedConfig systemGitConfig;
 
+	/**
+	 * Set the user-level git config
+	 *
+	 * @param userGitConfig
+	 *            set another user-level git config
+	 * @return the old user-level git config
+	 */
+	public FileBasedConfig setUserGitConfig(FileBasedConfig userGitConfig) {
+		FileBasedConfig old = this.userGitConfig;
+		this.userGitConfig = userGitConfig;
+		return old;
+	}
+
+	/**
+	 * Set the system-level git config
+	 *
+	 * @param systemGitConfig
+	 *            the new system-level git config
+	 * @return the old system-level config
+	 */
+	public FileBasedConfig setSystemGitConfig(FileBasedConfig systemGitConfig) {
+		FileBasedConfig old = this.systemGitConfig;
+		this.systemGitConfig = systemGitConfig;
+		return old;
+	}
+
+	/**
+	 * Constructor for <code>MockSystemReader</code>
+	 */
 	public MockSystemReader() {
 		init(Constants.OS_USER_NAME_KEY);
 		init(Constants.GIT_AUTHOR_NAME_KEY);
 		init(Constants.GIT_AUTHOR_EMAIL_KEY);
 		init(Constants.GIT_COMMITTER_NAME_KEY);
 		init(Constants.GIT_COMMITTER_EMAIL_KEY);
+		setProperty(Constants.OS_USER_DIR, ".");
 		userGitConfig = new MockConfig(null, null);
 		systemGitConfig = new MockConfig(null, null);
 		setCurrentPlatform();
 	}
 
-	private void init(final String n) {
+	private void init(String n) {
 		setProperty(n, n);
 	}
 
+	/**
+	 * Clear properties
+	 */
 	public void clearProperties() {
 		values.clear();
 	}
 
+	/**
+	 * Set a property
+	 *
+	 * @param key
+	 * @param value
+	 */
 	public void setProperty(String key, String value) {
 		values.put(key, value);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public String getenv(String variable) {
 		return values.get(variable);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public String getProperty(String key) {
 		return values.get(key);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public FileBasedConfig openUserConfig(Config parent, FS fs) {
 		assert parent == null || parent == systemGitConfig;
 		return userGitConfig;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public FileBasedConfig openSystemConfig(Config parent, FS fs) {
 		assert parent == null;
 		return systemGitConfig;
 	}
 
+	public StoredConfig getUserConfig() throws IOException, ConfigInvalidException {
+		return userGitConfig;
+	}
+
+	public StoredConfig getSystemConfig() throws IOException, ConfigInvalidException {
+		return systemGitConfig;
+	}
+
+	/** {@inheritDoc} */
 	@Override
 	public String getHostname() {
 		return "fake.host.example.com";
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public long getCurrentTime() {
-		return 1250379778668L; // Sat Aug 15 20:12:58 GMT-03:30 2009
+		return now;
 	}
 
+	/** {@inheritDoc} */
+	@Override
+	public MonotonicClock getClock() {
+		return () -> {
+			long t = getCurrentTime();
+			return new ProposedTimestamp() {
+
+				@Override
+				public long read(TimeUnit unit) {
+					return unit.convert(t, TimeUnit.MILLISECONDS);
+				}
+
+				@Override
+				public void blockUntil(Duration maxWait) {
+					// Do not wait.
+				}
+			};
+		};
+	}
+
+	/**
+	 * Adjusts the current time in seconds.
+	 *
+	 * @param secDelta
+	 *            number of seconds to add to the current time.
+	 * @since 4.2
+	 */
+	public void tick(int secDelta) {
+		now += secDelta * 1000L;
+	}
+
+	/** {@inheritDoc} */
 	@Override
 	public int getTimezone(long when) {
 		return getTimeZone().getOffset(when) / (60 * 1000);
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public TimeZone getTimeZone() {
 		return TimeZone.getTimeZone("GMT-03:30");
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public Locale getLocale() {
 		return Locale.US;
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public SimpleDateFormat getSimpleDateFormat(String pattern) {
 		return new SimpleDateFormat(pattern, getLocale());
 	}
 
+	/** {@inheritDoc} */
 	@Override
 	public DateFormat getDateTimeInstance(int dateStyle, int timeStyle) {
 		return DateFormat.getDateTimeInstance(dateStyle, timeStyle, getLocale());
@@ -172,6 +279,7 @@
 	 * Assign some properties for the currently executing platform
 	 */
 	public void setCurrentPlatform() {
+		resetOsNames();
 		setProperty("os.name", System.getProperty("os.name"));
 		setProperty("file.separator", System.getProperty("file.separator"));
 		setProperty("path.separator", System.getProperty("path.separator"));
@@ -182,19 +290,43 @@
 	 * Emulate Windows
 	 */
 	public void setWindows() {
+		resetOsNames();
 		setProperty("os.name", "Windows");
 		setProperty("file.separator", "\\");
 		setProperty("path.separator", ";");
 		setProperty("line.separator", "\r\n");
+		setPlatformChecker();
 	}
 
 	/**
 	 * Emulate Unix
 	 */
 	public void setUnix() {
+		resetOsNames();
 		setProperty("os.name", "*nix"); // Essentially anything but Windows
 		setProperty("file.separator", "/");
 		setProperty("path.separator", ":");
 		setProperty("line.separator", "\n");
+		setPlatformChecker();
 	}
+
+	private void resetOsNames() {
+		Field field;
+		try {
+			field = SystemReader.class.getDeclaredField("isWindows");
+			field.setAccessible(true);
+			field.set(null, null);
+			field = SystemReader.class.getDeclaredField("isMacOS");
+			field.setAccessible(true);
+			field.set(null, null);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+
+	@Override
+	public String toString() {
+		return "MockSystemReader";
+	}
+
 }