diff --git a/.bazelrc b/.bazelrc new file mode 100644 index 000000000..3a61f8cb7 --- /dev/null +++ b/.bazelrc @@ -0,0 +1,9 @@ +build --repository_cache=~/.gerritcodereview/bazel-cache/repository +build --experimental_strict_action_env +build --action_env=PATH +build --disk_cache=~/.gerritcodereview/bazel-cache/cas +build --java_toolchain //tools:error_prone_warnings_toolchain + +test --build_tests_only +test --test_output=errors + diff --git a/org.eclipse.jgit.ant.test/META-INF/MANIFEST.MF b/org.eclipse.jgit.ant.test/META-INF/MANIFEST.MF index 3ef2c4d14..9e38b4339 100644 --- a/org.eclipse.jgit.ant.test/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit.ant.test/META-INF/MANIFEST.MF @@ -4,13 +4,13 @@ Bundle-ManifestVersion: 2 Bundle-Name: %plugin_name Automatic-Module-Name: org.eclipse.jgit.ant.test Bundle-SymbolicName: org.eclipse.jgit.ant.test -Bundle-Version: 5.4.0.qualifier +Bundle-Version: 5.4.1.qualifier Bundle-ActivationPolicy: lazy Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Import-Package: org.apache.tools.ant, - org.eclipse.jgit.ant.tasks;version="[5.4.0,5.5.0)", - org.eclipse.jgit.junit;version="[5.4.0,5.5.0)", - org.eclipse.jgit.lib;version="[5.4.0,5.5.0)", - org.eclipse.jgit.util;version="[5.4.0,5.5.0)", + org.eclipse.jgit.ant.tasks;version="[5.4.1,5.5.0)", + org.eclipse.jgit.junit;version="[5.4.1,5.5.0)", + org.eclipse.jgit.lib;version="[5.4.1,5.5.0)", + org.eclipse.jgit.util;version="[5.4.1,5.5.0)", org.hamcrest.core;version="[1.1.0,2.0.0)", org.junit;version="[4.12,5.0.0)" diff --git a/org.eclipse.jgit.ant.test/pom.xml b/org.eclipse.jgit.ant.test/pom.xml index 0ba52d47c..8e8208f40 100644 --- a/org.eclipse.jgit.ant.test/pom.xml +++ b/org.eclipse.jgit.ant.test/pom.xml @@ -50,7 +50,7 @@ org.eclipse.jgit org.eclipse.jgit-parent - 5.4.0-SNAPSHOT + 5.4.1-SNAPSHOT org.eclipse.jgit.ant.test diff --git a/org.eclipse.jgit.ant/META-INF/MANIFEST.MF b/org.eclipse.jgit.ant/META-INF/MANIFEST.MF index 6a9e317f1..313ea3579 100644 --- a/org.eclipse.jgit.ant/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit.ant/META-INF/MANIFEST.MF @@ -3,11 +3,11 @@ Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Automatic-Module-Name: org.eclipse.jgit.ant Bundle-SymbolicName: org.eclipse.jgit.ant -Bundle-Version: 5.4.0.qualifier +Bundle-Version: 5.4.1.qualifier Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Import-Package: org.apache.tools.ant, - org.eclipse.jgit.storage.file;version="[5.4.0,5.5.0)" + org.eclipse.jgit.storage.file;version="[5.4.1,5.5.0)" Bundle-Localization: plugin Bundle-Vendor: %Provider-Name -Export-Package: org.eclipse.jgit.ant.tasks;version="5.4.0"; +Export-Package: org.eclipse.jgit.ant.tasks;version="5.4.1"; uses:="org.apache.tools.ant.types,org.apache.tools.ant" diff --git a/org.eclipse.jgit.ant/META-INF/SOURCE-MANIFEST.MF b/org.eclipse.jgit.ant/META-INF/SOURCE-MANIFEST.MF index 032619178..8e62fb441 100644 --- a/org.eclipse.jgit.ant/META-INF/SOURCE-MANIFEST.MF +++ b/org.eclipse.jgit.ant/META-INF/SOURCE-MANIFEST.MF @@ -3,5 +3,5 @@ Bundle-ManifestVersion: 2 Bundle-Name: org.eclipse.jgit.ant - Sources Bundle-SymbolicName: org.eclipse.jgit.ant.source Bundle-Vendor: Eclipse.org - JGit -Bundle-Version: 5.4.0.qualifier -Eclipse-SourceBundle: org.eclipse.jgit.ant;version="5.4.0.qualifier";roots="." +Bundle-Version: 5.4.1.qualifier +Eclipse-SourceBundle: org.eclipse.jgit.ant;version="5.4.1.qualifier";roots="." diff --git a/org.eclipse.jgit.ant/pom.xml b/org.eclipse.jgit.ant/pom.xml index f43f1af6e..c7fb95aa0 100644 --- a/org.eclipse.jgit.ant/pom.xml +++ b/org.eclipse.jgit.ant/pom.xml @@ -48,7 +48,7 @@ org.eclipse.jgit org.eclipse.jgit-parent - 5.4.0-SNAPSHOT + 5.4.1-SNAPSHOT org.eclipse.jgit.ant diff --git a/org.eclipse.jgit.archive/META-INF/MANIFEST.MF b/org.eclipse.jgit.archive/META-INF/MANIFEST.MF index 4d04f2964..f033786b5 100644 --- a/org.eclipse.jgit.archive/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit.archive/META-INF/MANIFEST.MF @@ -3,7 +3,7 @@ Bundle-ManifestVersion: 2 Bundle-Name: %plugin_name Automatic-Module-Name: org.eclipse.jgit.archive Bundle-SymbolicName: org.eclipse.jgit.archive -Bundle-Version: 5.4.0.qualifier +Bundle-Version: 5.4.1.qualifier Bundle-Vendor: %provider_name Bundle-Localization: plugin Bundle-RequiredExecutionEnvironment: JavaSE-1.8 @@ -13,15 +13,15 @@ Import-Package: org.apache.commons.compress.archivers;version="[1.4,2.0)", org.apache.commons.compress.compressors.bzip2;version="[1.4,2.0)", org.apache.commons.compress.compressors.gzip;version="[1.4,2.0)", org.apache.commons.compress.compressors.xz;version="[1.4,2.0)", - org.eclipse.jgit.api;version="[5.4.0,5.5.0)", - org.eclipse.jgit.lib;version="[5.4.0,5.5.0)", - org.eclipse.jgit.nls;version="[5.4.0,5.5.0)", - org.eclipse.jgit.revwalk;version="[5.4.0,5.5.0)", - org.eclipse.jgit.util;version="[5.4.0,5.5.0)", + org.eclipse.jgit.api;version="[5.4.1,5.5.0)", + org.eclipse.jgit.lib;version="[5.4.1,5.5.0)", + org.eclipse.jgit.nls;version="[5.4.1,5.5.0)", + org.eclipse.jgit.revwalk;version="[5.4.1,5.5.0)", + org.eclipse.jgit.util;version="[5.4.1,5.5.0)", org.osgi.framework;version="[1.3.0,2.0.0)" Bundle-ActivationPolicy: lazy Bundle-Activator: org.eclipse.jgit.archive.FormatActivator -Export-Package: org.eclipse.jgit.archive;version="5.4.0"; +Export-Package: org.eclipse.jgit.archive;version="5.4.1"; uses:="org.eclipse.jgit.lib, org.eclipse.jgit.api, org.apache.commons.compress.archivers, diff --git a/org.eclipse.jgit.archive/META-INF/SOURCE-MANIFEST.MF b/org.eclipse.jgit.archive/META-INF/SOURCE-MANIFEST.MF index 87e3931a6..30928f83f 100644 --- a/org.eclipse.jgit.archive/META-INF/SOURCE-MANIFEST.MF +++ b/org.eclipse.jgit.archive/META-INF/SOURCE-MANIFEST.MF @@ -3,5 +3,5 @@ Bundle-ManifestVersion: 2 Bundle-Name: org.eclipse.jgit.archive - Sources Bundle-SymbolicName: org.eclipse.jgit.archive.source Bundle-Vendor: Eclipse.org - JGit -Bundle-Version: 5.4.0.qualifier -Eclipse-SourceBundle: org.eclipse.jgit.archive;version="5.4.0.qualifier";roots="." +Bundle-Version: 5.4.1.qualifier +Eclipse-SourceBundle: org.eclipse.jgit.archive;version="5.4.1.qualifier";roots="." diff --git a/org.eclipse.jgit.archive/pom.xml b/org.eclipse.jgit.archive/pom.xml index 1207d1946..a3f9520ac 100644 --- a/org.eclipse.jgit.archive/pom.xml +++ b/org.eclipse.jgit.archive/pom.xml @@ -50,7 +50,7 @@ org.eclipse.jgit org.eclipse.jgit-parent - 5.4.0-SNAPSHOT + 5.4.1-SNAPSHOT org.eclipse.jgit.archive diff --git a/org.eclipse.jgit.coverage/pom.xml b/org.eclipse.jgit.coverage/pom.xml index 6e199e9c0..12c75527e 100644 --- a/org.eclipse.jgit.coverage/pom.xml +++ b/org.eclipse.jgit.coverage/pom.xml @@ -5,7 +5,7 @@ org.eclipse.jgit org.eclipse.jgit-parent - 5.4.0-SNAPSHOT + 5.4.1-SNAPSHOT 4.0.0 @@ -18,88 +18,88 @@ org.eclipse.jgit org.eclipse.jgit - 5.4.0-SNAPSHOT + 5.4.1-SNAPSHOT org.eclipse.jgit org.eclipse.jgit.ant - 5.4.0-SNAPSHOT + 5.4.1-SNAPSHOT org.eclipse.jgit org.eclipse.jgit.archive - 5.4.0-SNAPSHOT + 5.4.1-SNAPSHOT org.eclipse.jgit org.eclipse.jgit.http.apache - 5.4.0-SNAPSHOT + 5.4.1-SNAPSHOT org.eclipse.jgit org.eclipse.jgit.http.server - 5.4.0-SNAPSHOT + 5.4.1-SNAPSHOT org.eclipse.jgit org.eclipse.jgit.lfs - 5.4.0-SNAPSHOT + 5.4.1-SNAPSHOT org.eclipse.jgit org.eclipse.jgit.lfs.server - 5.4.0-SNAPSHOT + 5.4.1-SNAPSHOT org.eclipse.jgit org.eclipse.jgit.pgm - 5.4.0-SNAPSHOT + 5.4.1-SNAPSHOT org.eclipse.jgit org.eclipse.jgit.ui - 5.4.0-SNAPSHOT + 5.4.1-SNAPSHOT org.eclipse.jgit org.eclipse.jgit.ssh.apache - 5.4.0-SNAPSHOT + 5.4.1-SNAPSHOT org.eclipse.jgit org.eclipse.jgit.test - 5.4.0-SNAPSHOT + 5.4.1-SNAPSHOT org.eclipse.jgit org.eclipse.jgit.ant.test - 5.4.0-SNAPSHOT + 5.4.1-SNAPSHOT org.eclipse.jgit org.eclipse.jgit.http.test - 5.4.0-SNAPSHOT + 5.4.1-SNAPSHOT org.eclipse.jgit org.eclipse.jgit.pgm.test - 5.4.0-SNAPSHOT + 5.4.1-SNAPSHOT org.eclipse.jgit org.eclipse.jgit.lfs.test - 5.4.0-SNAPSHOT + 5.4.1-SNAPSHOT org.eclipse.jgit org.eclipse.jgit.lfs.server.test - 5.4.0-SNAPSHOT + 5.4.1-SNAPSHOT org.eclipse.jgit org.eclipse.jgit.ssh.apache.test - 5.4.0-SNAPSHOT + 5.4.1-SNAPSHOT diff --git a/org.eclipse.jgit.http.apache/META-INF/MANIFEST.MF b/org.eclipse.jgit.http.apache/META-INF/MANIFEST.MF index 5a8ae0ba5..8206e8a9d 100644 --- a/org.eclipse.jgit.http.apache/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit.http.apache/META-INF/MANIFEST.MF @@ -3,7 +3,7 @@ Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Automatic-Module-Name: org.eclipse.jgit.http.apache Bundle-SymbolicName: org.eclipse.jgit.http.apache -Bundle-Version: 5.4.0.qualifier +Bundle-Version: 5.4.1.qualifier Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-Localization: plugin Bundle-Vendor: %Provider-Name @@ -23,11 +23,11 @@ Import-Package: org.apache.http;version="[4.3.0,5.0.0)", org.apache.http.impl.client;version="[4.3.0,5.0.0)", org.apache.http.impl.conn;version="[4.3.0,5.0.0)", org.apache.http.params;version="[4.3.0,5.0.0)", - org.eclipse.jgit.annotations;version="[5.4.0,5.5.0)", - org.eclipse.jgit.nls;version="[5.4.0,5.5.0)", - org.eclipse.jgit.transport.http;version="[5.4.0,5.5.0)", - org.eclipse.jgit.util;version="[5.4.0,5.5.0)" -Export-Package: org.eclipse.jgit.transport.http.apache;version="5.4.0"; + org.eclipse.jgit.annotations;version="[5.4.1,5.5.0)", + org.eclipse.jgit.nls;version="[5.4.1,5.5.0)", + org.eclipse.jgit.transport.http;version="[5.4.1,5.5.0)", + org.eclipse.jgit.util;version="[5.4.1,5.5.0)" +Export-Package: org.eclipse.jgit.transport.http.apache;version="5.4.1"; uses:="org.apache.http.client, org.eclipse.jgit.transport.http, org.apache.http.entity, diff --git a/org.eclipse.jgit.http.apache/META-INF/SOURCE-MANIFEST.MF b/org.eclipse.jgit.http.apache/META-INF/SOURCE-MANIFEST.MF index bffe9f110..5aeb331cb 100644 --- a/org.eclipse.jgit.http.apache/META-INF/SOURCE-MANIFEST.MF +++ b/org.eclipse.jgit.http.apache/META-INF/SOURCE-MANIFEST.MF @@ -3,5 +3,5 @@ Bundle-ManifestVersion: 2 Bundle-Name: org.eclipse.jgit.http.apache - Sources Bundle-SymbolicName: org.eclipse.jgit.http.apache.source Bundle-Vendor: Eclipse.org - JGit -Bundle-Version: 5.4.0.qualifier -Eclipse-SourceBundle: org.eclipse.jgit.http.apache;version="5.4.0.qualifier";roots="." +Bundle-Version: 5.4.1.qualifier +Eclipse-SourceBundle: org.eclipse.jgit.http.apache;version="5.4.1.qualifier";roots="." diff --git a/org.eclipse.jgit.http.apache/pom.xml b/org.eclipse.jgit.http.apache/pom.xml index 5d1b386fb..d2665c04c 100644 --- a/org.eclipse.jgit.http.apache/pom.xml +++ b/org.eclipse.jgit.http.apache/pom.xml @@ -48,7 +48,7 @@ org.eclipse.jgit org.eclipse.jgit-parent - 5.4.0-SNAPSHOT + 5.4.1-SNAPSHOT org.eclipse.jgit.http.apache diff --git a/org.eclipse.jgit.http.server/META-INF/MANIFEST.MF b/org.eclipse.jgit.http.server/META-INF/MANIFEST.MF index 0c885a67f..a231f5828 100644 --- a/org.eclipse.jgit.http.server/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit.http.server/META-INF/MANIFEST.MF @@ -3,13 +3,13 @@ Bundle-ManifestVersion: 2 Bundle-Name: %plugin_name Automatic-Module-Name: org.eclipse.jgit.http.server Bundle-SymbolicName: org.eclipse.jgit.http.server -Bundle-Version: 5.4.0.qualifier +Bundle-Version: 5.4.1.qualifier Bundle-Localization: plugin Bundle-Vendor: %provider_name -Export-Package: org.eclipse.jgit.http.server;version="5.4.0", - org.eclipse.jgit.http.server.glue;version="5.4.0"; +Export-Package: org.eclipse.jgit.http.server;version="5.4.1", + org.eclipse.jgit.http.server.glue;version="5.4.1"; uses:="javax.servlet,javax.servlet.http", - org.eclipse.jgit.http.server.resolver;version="5.4.0"; + org.eclipse.jgit.http.server.resolver;version="5.4.1"; uses:="org.eclipse.jgit.transport.resolver, org.eclipse.jgit.lib, org.eclipse.jgit.transport, @@ -18,13 +18,13 @@ Bundle-ActivationPolicy: lazy Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Import-Package: javax.servlet;version="[2.5.0,3.2.0)", javax.servlet.http;version="[2.5.0,3.2.0)", - org.eclipse.jgit.errors;version="[5.4.0,5.5.0)", - org.eclipse.jgit.internal.storage.dfs;version="[5.4.0,5.5.0)", - org.eclipse.jgit.internal.storage.file;version="[5.4.0,5.5.0)", - org.eclipse.jgit.internal.transport.parser;version="[5.4.0,5.5.0)", - org.eclipse.jgit.lib;version="[5.4.0,5.5.0)", - org.eclipse.jgit.nls;version="[5.4.0,5.5.0)", - org.eclipse.jgit.revwalk;version="[5.4.0,5.5.0)", - org.eclipse.jgit.transport;version="[5.4.0,5.5.0)", - org.eclipse.jgit.transport.resolver;version="[5.4.0,5.5.0)", - org.eclipse.jgit.util;version="[5.4.0,5.5.0)" + org.eclipse.jgit.errors;version="[5.4.1,5.5.0)", + org.eclipse.jgit.internal.storage.dfs;version="[5.4.1,5.5.0)", + org.eclipse.jgit.internal.storage.file;version="[5.4.1,5.5.0)", + org.eclipse.jgit.internal.transport.parser;version="[5.4.1,5.5.0)", + org.eclipse.jgit.lib;version="[5.4.1,5.5.0)", + org.eclipse.jgit.nls;version="[5.4.1,5.5.0)", + org.eclipse.jgit.revwalk;version="[5.4.1,5.5.0)", + org.eclipse.jgit.transport;version="[5.4.1,5.5.0)", + org.eclipse.jgit.transport.resolver;version="[5.4.1,5.5.0)", + org.eclipse.jgit.util;version="[5.4.1,5.5.0)" diff --git a/org.eclipse.jgit.http.server/META-INF/SOURCE-MANIFEST.MF b/org.eclipse.jgit.http.server/META-INF/SOURCE-MANIFEST.MF index 46451bbea..3a0655288 100644 --- a/org.eclipse.jgit.http.server/META-INF/SOURCE-MANIFEST.MF +++ b/org.eclipse.jgit.http.server/META-INF/SOURCE-MANIFEST.MF @@ -3,5 +3,5 @@ Bundle-ManifestVersion: 2 Bundle-Name: org.eclipse.jgit.http.server - Sources Bundle-SymbolicName: org.eclipse.jgit.http.server.source Bundle-Vendor: Eclipse.org - JGit -Bundle-Version: 5.4.0.qualifier -Eclipse-SourceBundle: org.eclipse.jgit.http.server;version="5.4.0.qualifier";roots="." +Bundle-Version: 5.4.1.qualifier +Eclipse-SourceBundle: org.eclipse.jgit.http.server;version="5.4.1.qualifier";roots="." diff --git a/org.eclipse.jgit.http.server/pom.xml b/org.eclipse.jgit.http.server/pom.xml index b160bfabe..f79503860 100644 --- a/org.eclipse.jgit.http.server/pom.xml +++ b/org.eclipse.jgit.http.server/pom.xml @@ -52,7 +52,7 @@ org.eclipse.jgit org.eclipse.jgit-parent - 5.4.0-SNAPSHOT + 5.4.1-SNAPSHOT org.eclipse.jgit.http.server diff --git a/org.eclipse.jgit.http.test/META-INF/MANIFEST.MF b/org.eclipse.jgit.http.test/META-INF/MANIFEST.MF index cd161beff..4d4b3e460 100644 --- a/org.eclipse.jgit.http.test/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit.http.test/META-INF/MANIFEST.MF @@ -3,7 +3,7 @@ Bundle-ManifestVersion: 2 Bundle-Name: %plugin_name Automatic-Module-Name: org.eclipse.jgit.http.test Bundle-SymbolicName: org.eclipse.jgit.http.test -Bundle-Version: 5.4.0.qualifier +Bundle-Version: 5.4.1.qualifier Bundle-Vendor: %provider_name Bundle-Localization: plugin Bundle-RequiredExecutionEnvironment: JavaSE-1.8 @@ -28,25 +28,25 @@ Import-Package: javax.servlet;version="[2.5.0,3.2.0)", org.eclipse.jetty.util.log;version="[9.4.5,10.0.0)", org.eclipse.jetty.util.security;version="[9.4.5,10.0.0)", org.eclipse.jetty.util.thread;version="[9.4.5,10.0.0)", - org.eclipse.jgit.errors;version="[5.4.0,5.5.0)", - org.eclipse.jgit.http.server;version="[5.4.0,5.5.0)", - org.eclipse.jgit.http.server.glue;version="[5.4.0,5.5.0)", - org.eclipse.jgit.http.server.resolver;version="[5.4.0,5.5.0)", - org.eclipse.jgit.internal;version="[5.4.0,5.5.0)", - org.eclipse.jgit.internal.storage.dfs;version="[5.4.0,5.5.0)", - org.eclipse.jgit.internal.storage.file;version="[5.4.0,5.5.0)", - org.eclipse.jgit.internal.storage.reftable;version="[5.4.0,5.5.0)", - org.eclipse.jgit.junit;version="[5.4.0,5.5.0)", - org.eclipse.jgit.junit.http;version="[5.4.0,5.5.0)", - org.eclipse.jgit.lib;version="[5.4.0,5.5.0)", - org.eclipse.jgit.nls;version="[5.4.0,5.5.0)", - org.eclipse.jgit.revwalk;version="[5.4.0,5.5.0)", - org.eclipse.jgit.storage.file;version="[5.4.0,5.5.0)", - org.eclipse.jgit.transport;version="[5.4.0,5.5.0)", - org.eclipse.jgit.transport.http;version="[5.4.0,5.5.0)", - org.eclipse.jgit.transport.http.apache;version="[5.4.0,5.5.0)", - org.eclipse.jgit.transport.resolver;version="[5.4.0,5.5.0)", - org.eclipse.jgit.util;version="[5.4.0,5.5.0)", + org.eclipse.jgit.errors;version="[5.4.1,5.5.0)", + org.eclipse.jgit.http.server;version="[5.4.1,5.5.0)", + org.eclipse.jgit.http.server.glue;version="[5.4.1,5.5.0)", + org.eclipse.jgit.http.server.resolver;version="[5.4.1,5.5.0)", + org.eclipse.jgit.internal;version="[5.4.1,5.5.0)", + org.eclipse.jgit.internal.storage.dfs;version="[5.4.1,5.5.0)", + org.eclipse.jgit.internal.storage.file;version="[5.4.1,5.5.0)", + org.eclipse.jgit.internal.storage.reftable;version="[5.4.1,5.5.0)", + org.eclipse.jgit.junit;version="[5.4.1,5.5.0)", + org.eclipse.jgit.junit.http;version="[5.4.1,5.5.0)", + org.eclipse.jgit.lib;version="[5.4.1,5.5.0)", + org.eclipse.jgit.nls;version="[5.4.1,5.5.0)", + org.eclipse.jgit.revwalk;version="[5.4.1,5.5.0)", + org.eclipse.jgit.storage.file;version="[5.4.1,5.5.0)", + org.eclipse.jgit.transport;version="[5.4.1,5.5.0)", + org.eclipse.jgit.transport.http;version="[5.4.1,5.5.0)", + org.eclipse.jgit.transport.http.apache;version="[5.4.1,5.5.0)", + org.eclipse.jgit.transport.resolver;version="[5.4.1,5.5.0)", + org.eclipse.jgit.util;version="[5.4.1,5.5.0)", org.hamcrest;version="[1.1.0,2.0.0)", org.hamcrest.core;version="[1.1.0,2.0.0)", org.junit;version="[4.12,5.0.0)", diff --git a/org.eclipse.jgit.http.test/pom.xml b/org.eclipse.jgit.http.test/pom.xml index df8dc2790..df99448f2 100644 --- a/org.eclipse.jgit.http.test/pom.xml +++ b/org.eclipse.jgit.http.test/pom.xml @@ -51,7 +51,7 @@ org.eclipse.jgit org.eclipse.jgit-parent - 5.4.0-SNAPSHOT + 5.4.1-SNAPSHOT org.eclipse.jgit.http.test diff --git a/org.eclipse.jgit.junit.http/META-INF/MANIFEST.MF b/org.eclipse.jgit.junit.http/META-INF/MANIFEST.MF index c9b29ed57..ba38a8b65 100644 --- a/org.eclipse.jgit.junit.http/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit.junit.http/META-INF/MANIFEST.MF @@ -3,7 +3,7 @@ Bundle-ManifestVersion: 2 Bundle-Name: %plugin_name Automatic-Module-Name: org.eclipse.jgit.junit.http Bundle-SymbolicName: org.eclipse.jgit.junit.http -Bundle-Version: 5.4.0.qualifier +Bundle-Version: 5.4.1.qualifier Bundle-Localization: plugin Bundle-Vendor: %provider_name Bundle-ActivationPolicy: lazy @@ -22,16 +22,16 @@ Import-Package: javax.servlet;version="[2.5.0,3.2.0)", org.eclipse.jetty.util.log;version="[9.4.5,10.0.0)", org.eclipse.jetty.util.security;version="[9.4.5,10.0.0)", org.eclipse.jetty.util.ssl;version="[9.4.5,10.0.0)", - org.eclipse.jgit.errors;version="[5.4.0,5.5.0)", - org.eclipse.jgit.http.server;version="[5.4.0,5.5.0)", - org.eclipse.jgit.internal.storage.file;version="[5.4.0,5.5.0)", - org.eclipse.jgit.junit;version="[5.4.0,5.5.0)", - org.eclipse.jgit.lib;version="[5.4.0,5.5.0)", - org.eclipse.jgit.revwalk;version="[5.4.0,5.5.0)", - org.eclipse.jgit.transport;version="[5.4.0,5.5.0)", - org.eclipse.jgit.transport.resolver;version="[5.4.0,5.5.0)", + org.eclipse.jgit.errors;version="[5.4.1,5.5.0)", + org.eclipse.jgit.http.server;version="[5.4.1,5.5.0)", + org.eclipse.jgit.internal.storage.file;version="[5.4.1,5.5.0)", + org.eclipse.jgit.junit;version="[5.4.1,5.5.0)", + org.eclipse.jgit.lib;version="[5.4.1,5.5.0)", + org.eclipse.jgit.revwalk;version="[5.4.1,5.5.0)", + org.eclipse.jgit.transport;version="[5.4.1,5.5.0)", + org.eclipse.jgit.transport.resolver;version="[5.4.1,5.5.0)", org.junit;version="[4.12,5.0.0)" -Export-Package: org.eclipse.jgit.junit.http;version="5.4.0"; +Export-Package: org.eclipse.jgit.junit.http;version="5.4.1"; uses:="org.eclipse.jgit.transport, org.eclipse.jgit.junit, javax.servlet.http, diff --git a/org.eclipse.jgit.junit.http/META-INF/SOURCE-MANIFEST.MF b/org.eclipse.jgit.junit.http/META-INF/SOURCE-MANIFEST.MF index 5f88db1e3..0243f2f69 100644 --- a/org.eclipse.jgit.junit.http/META-INF/SOURCE-MANIFEST.MF +++ b/org.eclipse.jgit.junit.http/META-INF/SOURCE-MANIFEST.MF @@ -3,5 +3,5 @@ Bundle-ManifestVersion: 2 Bundle-Name: org.eclipse.jgit.junit.http - Sources Bundle-SymbolicName: org.eclipse.jgit.junit.http.source Bundle-Vendor: Eclipse.org - JGit -Bundle-Version: 5.4.0.qualifier -Eclipse-SourceBundle: org.eclipse.jgit.junit.http;version="5.4.0.qualifier";roots="." +Bundle-Version: 5.4.1.qualifier +Eclipse-SourceBundle: org.eclipse.jgit.junit.http;version="5.4.1.qualifier";roots="." diff --git a/org.eclipse.jgit.junit.http/pom.xml b/org.eclipse.jgit.junit.http/pom.xml index 7441d9f52..9bf2a2156 100644 --- a/org.eclipse.jgit.junit.http/pom.xml +++ b/org.eclipse.jgit.junit.http/pom.xml @@ -50,7 +50,7 @@ org.eclipse.jgit org.eclipse.jgit-parent - 5.4.0-SNAPSHOT + 5.4.1-SNAPSHOT org.eclipse.jgit.junit.http diff --git a/org.eclipse.jgit.junit.ssh/META-INF/MANIFEST.MF b/org.eclipse.jgit.junit.ssh/META-INF/MANIFEST.MF index 0d66eccbb..6b443f374 100644 --- a/org.eclipse.jgit.junit.ssh/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit.junit.ssh/META-INF/MANIFEST.MF @@ -3,7 +3,7 @@ Bundle-ManifestVersion: 2 Bundle-Name: %plugin_name Automatic-Module-Name: org.eclipse.jgit.junit.ssh Bundle-SymbolicName: org.eclipse.jgit.junit.ssh -Bundle-Version: 5.4.0.qualifier +Bundle-Version: 5.4.1.qualifier Bundle-Localization: plugin Bundle-Vendor: %provider_name Bundle-ActivationPolicy: lazy @@ -30,8 +30,8 @@ Import-Package: org.apache.sshd.common;version="[2.2.0,2.3.0)", org.apache.sshd.server.shell;version="[2.2.0,2.3.0)", org.apache.sshd.server.subsystem;version="[2.2.0,2.3.0)", org.apache.sshd.server.subsystem.sftp;version="[2.2.0,2.3.0)", - org.eclipse.jgit.annotations;version="[5.4.0,5.5.0)", - org.eclipse.jgit.lib;version="[5.4.0,5.5.0)", - org.eclipse.jgit.transport;version="[5.4.0,5.5.0)", + org.eclipse.jgit.annotations;version="[5.4.1,5.5.0)", + org.eclipse.jgit.lib;version="[5.4.1,5.5.0)", + org.eclipse.jgit.transport;version="[5.4.1,5.5.0)", org.slf4j;version="[1.7.0,2.0.0)" -Export-Package: org.eclipse.jgit.junit.ssh;version="5.4.0" +Export-Package: org.eclipse.jgit.junit.ssh;version="5.4.1" diff --git a/org.eclipse.jgit.junit.ssh/META-INF/SOURCE-MANIFEST.MF b/org.eclipse.jgit.junit.ssh/META-INF/SOURCE-MANIFEST.MF index ad94c4159..62fb41b02 100644 --- a/org.eclipse.jgit.junit.ssh/META-INF/SOURCE-MANIFEST.MF +++ b/org.eclipse.jgit.junit.ssh/META-INF/SOURCE-MANIFEST.MF @@ -3,5 +3,5 @@ Bundle-ManifestVersion: 2 Bundle-Name: org.eclipse.jgit.junit.ssh - Sources Bundle-SymbolicName: org.eclipse.jgit.junit.ssh.source Bundle-Vendor: Eclipse.org - JGit -Bundle-Version: 5.4.0.qualifier -Eclipse-SourceBundle: org.eclipse.jgit.junit.ssh;version="5.4.0.qualifier";roots="." +Bundle-Version: 5.4.1.qualifier +Eclipse-SourceBundle: org.eclipse.jgit.junit.ssh;version="5.4.1.qualifier";roots="." diff --git a/org.eclipse.jgit.junit.ssh/pom.xml b/org.eclipse.jgit.junit.ssh/pom.xml index 1c2830e3b..92fd1615c 100644 --- a/org.eclipse.jgit.junit.ssh/pom.xml +++ b/org.eclipse.jgit.junit.ssh/pom.xml @@ -50,7 +50,7 @@ org.eclipse.jgit org.eclipse.jgit-parent - 5.4.0-SNAPSHOT + 5.4.1-SNAPSHOT org.eclipse.jgit.junit.ssh diff --git a/org.eclipse.jgit.junit/META-INF/MANIFEST.MF b/org.eclipse.jgit.junit/META-INF/MANIFEST.MF index 308feb735..637fad018 100644 --- a/org.eclipse.jgit.junit/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit.junit/META-INF/MANIFEST.MF @@ -3,34 +3,34 @@ Bundle-ManifestVersion: 2 Bundle-Name: %plugin_name Automatic-Module-Name: org.eclipse.jgit.junit Bundle-SymbolicName: org.eclipse.jgit.junit -Bundle-Version: 5.4.0.qualifier +Bundle-Version: 5.4.1.qualifier Bundle-Localization: plugin Bundle-Vendor: %provider_name Bundle-ActivationPolicy: lazy Bundle-RequiredExecutionEnvironment: JavaSE-1.8 -Import-Package: org.eclipse.jgit.annotations;version="[5.4.0,5.5.0)", - org.eclipse.jgit.api;version="[5.4.0,5.5.0)", - org.eclipse.jgit.api.errors;version="[5.4.0,5.5.0)", - org.eclipse.jgit.dircache;version="[5.4.0,5.5.0)", - org.eclipse.jgit.errors;version="[5.4.0,5.5.0)", - org.eclipse.jgit.internal.storage.file;version="[5.4.0,5.5.0)", - org.eclipse.jgit.internal.storage.pack;version="[5.4.0,5.5.0)", - org.eclipse.jgit.lib;version="[5.4.0,5.5.0)", - org.eclipse.jgit.merge;version="[5.4.0,5.5.0)", - org.eclipse.jgit.revwalk;version="[5.4.0,5.5.0)", - org.eclipse.jgit.storage.file;version="[5.4.0,5.5.0)", - org.eclipse.jgit.transport;version="5.4.0", - org.eclipse.jgit.treewalk;version="[5.4.0,5.5.0)", - org.eclipse.jgit.treewalk.filter;version="[5.4.0,5.5.0)", - org.eclipse.jgit.util;version="[5.4.0,5.5.0)", - org.eclipse.jgit.util.io;version="[5.4.0,5.5.0)", - org.eclipse.jgit.util.time;version="[5.4.0,5.5.0)", +Import-Package: org.eclipse.jgit.annotations;version="[5.4.1,5.5.0)", + org.eclipse.jgit.api;version="[5.4.1,5.5.0)", + org.eclipse.jgit.api.errors;version="[5.4.1,5.5.0)", + org.eclipse.jgit.dircache;version="[5.4.1,5.5.0)", + org.eclipse.jgit.errors;version="[5.4.1,5.5.0)", + org.eclipse.jgit.internal.storage.file;version="[5.4.1,5.5.0)", + org.eclipse.jgit.internal.storage.pack;version="[5.4.1,5.5.0)", + org.eclipse.jgit.lib;version="[5.4.1,5.5.0)", + org.eclipse.jgit.merge;version="[5.4.1,5.5.0)", + org.eclipse.jgit.revwalk;version="[5.4.1,5.5.0)", + org.eclipse.jgit.storage.file;version="[5.4.1,5.5.0)", + org.eclipse.jgit.transport;version="5.4.1", + org.eclipse.jgit.treewalk;version="[5.4.1,5.5.0)", + org.eclipse.jgit.treewalk.filter;version="[5.4.1,5.5.0)", + org.eclipse.jgit.util;version="[5.4.1,5.5.0)", + org.eclipse.jgit.util.io;version="[5.4.1,5.5.0)", + org.eclipse.jgit.util.time;version="[5.4.1,5.5.0)", org.junit;version="[4.12,5.0.0)", org.junit.rules;version="[4.12,5.0.0)", org.junit.runner;version="[4.12,5.0.0)", org.junit.runners.model;version="[4.12,5.0.0)", org.slf4j;version="[1.7.0,2.0.0)" -Export-Package: org.eclipse.jgit.junit;version="5.4.0"; +Export-Package: org.eclipse.jgit.junit;version="5.4.1"; uses:="org.eclipse.jgit.dircache, org.eclipse.jgit.lib, org.eclipse.jgit.revwalk, @@ -43,4 +43,4 @@ Export-Package: org.eclipse.jgit.junit;version="5.4.0"; org.junit.runners.model, org.junit.runner, org.eclipse.jgit.util.time", - org.eclipse.jgit.junit.time;version="5.4.0";uses:="org.eclipse.jgit.util.time" + org.eclipse.jgit.junit.time;version="5.4.1";uses:="org.eclipse.jgit.util.time" diff --git a/org.eclipse.jgit.junit/META-INF/SOURCE-MANIFEST.MF b/org.eclipse.jgit.junit/META-INF/SOURCE-MANIFEST.MF index ad3ad5bbc..f244ece29 100644 --- a/org.eclipse.jgit.junit/META-INF/SOURCE-MANIFEST.MF +++ b/org.eclipse.jgit.junit/META-INF/SOURCE-MANIFEST.MF @@ -3,5 +3,5 @@ Bundle-ManifestVersion: 2 Bundle-Name: org.eclipse.jgit.junit - Sources Bundle-SymbolicName: org.eclipse.jgit.junit.source Bundle-Vendor: Eclipse.org - JGit -Bundle-Version: 5.4.0.qualifier -Eclipse-SourceBundle: org.eclipse.jgit.junit;version="5.4.0.qualifier";roots="." +Bundle-Version: 5.4.1.qualifier +Eclipse-SourceBundle: org.eclipse.jgit.junit;version="5.4.1.qualifier";roots="." diff --git a/org.eclipse.jgit.junit/pom.xml b/org.eclipse.jgit.junit/pom.xml index b6f5b35fb..392fd5142 100644 --- a/org.eclipse.jgit.junit/pom.xml +++ b/org.eclipse.jgit.junit/pom.xml @@ -52,7 +52,7 @@ org.eclipse.jgit org.eclipse.jgit-parent - 5.4.0-SNAPSHOT + 5.4.1-SNAPSHOT org.eclipse.jgit.junit diff --git a/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/RepositoryTestCase.java b/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/RepositoryTestCase.java index 48d016c06..a5270ed2b 100644 --- a/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/RepositoryTestCase.java +++ b/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/RepositoryTestCase.java @@ -349,7 +349,8 @@ public static String slashify(String str) { * younger modification timestamp than the modification timestamp of the * given file. This is done by touching a temporary file, reading the * lastmodified attribute and, if needed, sleeping. After sleeping this loop - * starts again until the filesystem timer has advanced enough. + * starts again until the filesystem timer has advanced enough. The + * temporary file will be created as a sibling of lastFile. * * @param lastFile * the file on which we want to wait until the filesystem timer @@ -362,21 +363,26 @@ public static String slashify(String str) { */ public static long fsTick(File lastFile) throws InterruptedException, IOException { - long sleepTime = 64; + File tmp; FS fs = FS.DETECTED; - if (lastFile != null && !fs.exists(lastFile)) - throw new FileNotFoundException(lastFile.getPath()); - File tmp = File.createTempFile("FileTreeIteratorWithTimeControl", null); + if (lastFile == null) { + lastFile = tmp = File + .createTempFile("fsTickTmpFile", null); + } else { + if (!fs.exists(lastFile)) { + throw new FileNotFoundException(lastFile.getPath()); + } + tmp = File.createTempFile("fsTickTmpFile", null, + lastFile.getParentFile()); + } + long res = FS.getFsTimerResolution(tmp.toPath()).toMillis(); + long sleepTime = res / 10; try { - long startTime = (lastFile == null) ? fs.lastModified(tmp) : fs - .lastModified(lastFile); + long startTime = fs.lastModified(lastFile); long actTime = fs.lastModified(tmp); while (actTime <= startTime) { Thread.sleep(sleepTime); - sleepTime *= 2; - try (FileOutputStream fos = new FileOutputStream(tmp)) { - // Do nothing - } + FileUtils.touch(tmp.toPath()); actTime = fs.lastModified(tmp); } return actTime; diff --git a/org.eclipse.jgit.lfs.server.test/META-INF/MANIFEST.MF b/org.eclipse.jgit.lfs.server.test/META-INF/MANIFEST.MF index bf3c1c754..d5bf49444 100644 --- a/org.eclipse.jgit.lfs.server.test/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit.lfs.server.test/META-INF/MANIFEST.MF @@ -3,7 +3,7 @@ Bundle-ManifestVersion: 2 Bundle-Name: %plugin_name Automatic-Module-Name: org.eclipse.jgit.lfs.server.test Bundle-SymbolicName: org.eclipse.jgit.lfs.server.test -Bundle-Version: 5.4.0.qualifier +Bundle-Version: 5.4.1.qualifier Bundle-Vendor: %provider_name Bundle-Localization: plugin Bundle-RequiredExecutionEnvironment: JavaSE-1.8 @@ -28,24 +28,24 @@ Import-Package: javax.servlet;version="[3.1.0,4.0.0)", org.eclipse.jetty.util.log;version="[9.4.5,10.0.0)", org.eclipse.jetty.util.security;version="[9.4.5,10.0.0)", org.eclipse.jetty.util.thread;version="[9.4.5,10.0.0)", - org.eclipse.jgit.api;version="[5.4.0,5.5.0)", - org.eclipse.jgit.api.errors;version="[5.4.0,5.5.0)", - org.eclipse.jgit.internal.storage.file;version="[5.4.0,5.5.0)", - org.eclipse.jgit.junit;version="[5.4.0,5.5.0)", - org.eclipse.jgit.junit.http;version="[5.4.0,5.5.0)", - org.eclipse.jgit.lfs;version="[5.4.0,5.5.0)", - org.eclipse.jgit.lfs.errors;version="[5.4.0,5.5.0)", - org.eclipse.jgit.lfs.lib;version="[5.4.0,5.5.0)", - org.eclipse.jgit.lfs.server;version="[5.4.0,5.5.0)", - org.eclipse.jgit.lfs.server.fs;version="[5.4.0,5.5.0)", - org.eclipse.jgit.lfs.test;version="[5.4.0,5.5.0)", - org.eclipse.jgit.lib;version="[5.4.0,5.5.0)", - org.eclipse.jgit.revwalk;version="[5.4.0,5.5.0)", - org.eclipse.jgit.storage.file;version="[5.4.0,5.5.0)", - org.eclipse.jgit.transport;version="[5.4.0,5.5.0)", - org.eclipse.jgit.treewalk;version="[5.4.0,5.5.0)", - org.eclipse.jgit.treewalk.filter;version="[5.4.0,5.5.0)", - org.eclipse.jgit.util;version="[5.4.0,5.5.0)", + org.eclipse.jgit.api;version="[5.4.1,5.5.0)", + org.eclipse.jgit.api.errors;version="[5.4.1,5.5.0)", + org.eclipse.jgit.internal.storage.file;version="[5.4.1,5.5.0)", + org.eclipse.jgit.junit;version="[5.4.1,5.5.0)", + org.eclipse.jgit.junit.http;version="[5.4.1,5.5.0)", + org.eclipse.jgit.lfs;version="[5.4.1,5.5.0)", + org.eclipse.jgit.lfs.errors;version="[5.4.1,5.5.0)", + org.eclipse.jgit.lfs.lib;version="[5.4.1,5.5.0)", + org.eclipse.jgit.lfs.server;version="[5.4.1,5.5.0)", + org.eclipse.jgit.lfs.server.fs;version="[5.4.1,5.5.0)", + org.eclipse.jgit.lfs.test;version="[5.4.1,5.5.0)", + org.eclipse.jgit.lib;version="[5.4.1,5.5.0)", + org.eclipse.jgit.revwalk;version="[5.4.1,5.5.0)", + org.eclipse.jgit.storage.file;version="[5.4.1,5.5.0)", + org.eclipse.jgit.transport;version="[5.4.1,5.5.0)", + org.eclipse.jgit.treewalk;version="[5.4.1,5.5.0)", + org.eclipse.jgit.treewalk.filter;version="[5.4.1,5.5.0)", + org.eclipse.jgit.util;version="[5.4.1,5.5.0)", org.hamcrest.core;version="[1.1.0,2.0.0)", org.junit;version="[4.12,5.0.0)", org.junit.rules;version="[4.12,5.0.0)", diff --git a/org.eclipse.jgit.lfs.server.test/pom.xml b/org.eclipse.jgit.lfs.server.test/pom.xml index ce1e280f9..7194449b0 100644 --- a/org.eclipse.jgit.lfs.server.test/pom.xml +++ b/org.eclipse.jgit.lfs.server.test/pom.xml @@ -50,7 +50,7 @@ org.eclipse.jgit org.eclipse.jgit-parent - 5.4.0-SNAPSHOT + 5.4.1-SNAPSHOT org.eclipse.jgit.lfs.server.test diff --git a/org.eclipse.jgit.lfs.server/META-INF/MANIFEST.MF b/org.eclipse.jgit.lfs.server/META-INF/MANIFEST.MF index 9fca01093..ab14a1682 100644 --- a/org.eclipse.jgit.lfs.server/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit.lfs.server/META-INF/MANIFEST.MF @@ -3,19 +3,19 @@ Bundle-ManifestVersion: 2 Bundle-Name: %plugin_name Automatic-Module-Name: org.eclipse.jgit.lfs.server Bundle-SymbolicName: org.eclipse.jgit.lfs.server -Bundle-Version: 5.4.0.qualifier +Bundle-Version: 5.4.1.qualifier Bundle-Localization: plugin Bundle-Vendor: %provider_name -Export-Package: org.eclipse.jgit.lfs.server;version="5.4.0"; +Export-Package: org.eclipse.jgit.lfs.server;version="5.4.1"; uses:="javax.servlet.http, org.eclipse.jgit.lfs.lib", - org.eclipse.jgit.lfs.server.fs;version="5.4.0"; + org.eclipse.jgit.lfs.server.fs;version="5.4.1"; uses:="javax.servlet, javax.servlet.http, org.eclipse.jgit.lfs.server, org.eclipse.jgit.lfs.lib", - org.eclipse.jgit.lfs.server.internal;version="5.4.0";x-internal:=true, - org.eclipse.jgit.lfs.server.s3;version="5.4.0"; + org.eclipse.jgit.lfs.server.internal;version="5.4.1";x-internal:=true, + org.eclipse.jgit.lfs.server.s3;version="5.4.1"; uses:="org.eclipse.jgit.lfs.server, org.eclipse.jgit.lfs.lib" Bundle-RequiredExecutionEnvironment: JavaSE-1.8 @@ -25,15 +25,15 @@ Import-Package: com.google.gson;version="[2.8.0,3.0.0)", javax.servlet.http;version="[3.1.0,4.0.0)", org.apache.http;version="[4.3.0,5.0.0)", org.apache.http.client;version="[4.3.0,5.0.0)", - org.eclipse.jgit.annotations;version="[5.4.0,5.5.0)", - org.eclipse.jgit.internal;version="[5.4.0,5.5.0)", - org.eclipse.jgit.internal.storage.file;version="[5.4.0,5.5.0)", - org.eclipse.jgit.lfs.errors;version="[5.4.0,5.5.0)", - org.eclipse.jgit.lfs.internal;version="[5.4.0,5.5.0)", - org.eclipse.jgit.lfs.lib;version="[5.4.0,5.5.0)", - org.eclipse.jgit.lib;version="[5.4.0,5.5.0)", - org.eclipse.jgit.nls;version="[5.4.0,5.5.0)", - org.eclipse.jgit.transport.http;version="[5.4.0,5.5.0)", - org.eclipse.jgit.transport.http.apache;version="[5.4.0,5.5.0)", - org.eclipse.jgit.util;version="[5.4.0,5.5.0)", + org.eclipse.jgit.annotations;version="[5.4.1,5.5.0)", + org.eclipse.jgit.internal;version="[5.4.1,5.5.0)", + org.eclipse.jgit.internal.storage.file;version="[5.4.1,5.5.0)", + org.eclipse.jgit.lfs.errors;version="[5.4.1,5.5.0)", + org.eclipse.jgit.lfs.internal;version="[5.4.1,5.5.0)", + org.eclipse.jgit.lfs.lib;version="[5.4.1,5.5.0)", + org.eclipse.jgit.lib;version="[5.4.1,5.5.0)", + org.eclipse.jgit.nls;version="[5.4.1,5.5.0)", + org.eclipse.jgit.transport.http;version="[5.4.1,5.5.0)", + org.eclipse.jgit.transport.http.apache;version="[5.4.1,5.5.0)", + org.eclipse.jgit.util;version="[5.4.1,5.5.0)", org.slf4j;version="[1.7.0,2.0.0)" diff --git a/org.eclipse.jgit.lfs.server/META-INF/SOURCE-MANIFEST.MF b/org.eclipse.jgit.lfs.server/META-INF/SOURCE-MANIFEST.MF index 370c72959..abf1dd223 100644 --- a/org.eclipse.jgit.lfs.server/META-INF/SOURCE-MANIFEST.MF +++ b/org.eclipse.jgit.lfs.server/META-INF/SOURCE-MANIFEST.MF @@ -3,5 +3,5 @@ Bundle-ManifestVersion: 2 Bundle-Name: org.eclipse.jgit.lfs.server - Sources Bundle-SymbolicName: org.eclipse.jgit.lfs.server.source Bundle-Vendor: Eclipse.org - JGit -Bundle-Version: 5.4.0.qualifier -Eclipse-SourceBundle: org.eclipse.jgit.lfs.server;version="5.4.0.qualifier";roots="." +Bundle-Version: 5.4.1.qualifier +Eclipse-SourceBundle: org.eclipse.jgit.lfs.server;version="5.4.1.qualifier";roots="." diff --git a/org.eclipse.jgit.lfs.server/pom.xml b/org.eclipse.jgit.lfs.server/pom.xml index 3fa460d6c..8a954bb7c 100644 --- a/org.eclipse.jgit.lfs.server/pom.xml +++ b/org.eclipse.jgit.lfs.server/pom.xml @@ -50,7 +50,7 @@ org.eclipse.jgit org.eclipse.jgit-parent - 5.4.0-SNAPSHOT + 5.4.1-SNAPSHOT org.eclipse.jgit.lfs.server diff --git a/org.eclipse.jgit.lfs.test/META-INF/MANIFEST.MF b/org.eclipse.jgit.lfs.test/META-INF/MANIFEST.MF index 0d261f9f5..a4f55a61b 100644 --- a/org.eclipse.jgit.lfs.test/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit.lfs.test/META-INF/MANIFEST.MF @@ -3,23 +3,22 @@ Bundle-ManifestVersion: 2 Bundle-Name: %plugin_name Automatic-Module-Name: org.eclipse.jgit.lfs.test Bundle-SymbolicName: org.eclipse.jgit.lfs.test -Bundle-Version: 5.4.0.qualifier +Bundle-Version: 5.4.1.qualifier Bundle-Vendor: %provider_name Bundle-Localization: plugin Bundle-RequiredExecutionEnvironment: JavaSE-1.8 -Import-Package: org.eclipse.jgit.internal.storage.dfs;version="[5.4.0,5.5.0)", - org.eclipse.jgit.junit;version="[5.4.0,5.5.0)", - org.eclipse.jgit.lfs;version="[5.4.0,5.5.0)", - org.eclipse.jgit.lfs.errors;version="[5.4.0,5.5.0)", - org.eclipse.jgit.lfs.lib;version="[5.4.0,5.5.0)", - org.eclipse.jgit.lib;version="[5.4.0,5.5.0)", - org.eclipse.jgit.revwalk;version="[5.4.0,5.5.0)", - org.eclipse.jgit.treewalk;version="[5.4.0,5.5.0)", - org.eclipse.jgit.treewalk.filter;version="[5.4.0,5.5.0)", - org.eclipse.jgit.util;version="[5.4.0,5.5.0)", +Import-Package: org.eclipse.jgit.internal.storage.dfs;version="[5.4.1,5.5.0)", + org.eclipse.jgit.junit;version="[5.4.1,5.5.0)", + org.eclipse.jgit.lfs;version="[5.4.1,5.5.0)", + org.eclipse.jgit.lfs.errors;version="[5.4.1,5.5.0)", + org.eclipse.jgit.lfs.lib;version="[5.4.1,5.5.0)", + org.eclipse.jgit.lib;version="[5.4.1,5.5.0)", + org.eclipse.jgit.revwalk;version="[5.4.1,5.5.0)", + org.eclipse.jgit.treewalk;version="[5.4.1,5.5.0)", + org.eclipse.jgit.treewalk.filter;version="[5.4.1,5.5.0)", + org.eclipse.jgit.util;version="[5.4.1,5.5.0)", org.hamcrest.core;version="[1.1.0,2.0.0)", org.junit;version="[4.12,5.0.0)", org.junit.runner;version="[4.12,5.0.0)", org.junit.runners;version="[4.12,5.0.0)" -Export-Package: org.eclipse.jgit.lfs.test;version="5.4.0";x-friends:="org.eclipse.jgit.lfs.server.test" - +Export-Package: org.eclipse.jgit.lfs.test;version="5.4.1";x-friends:="org.eclipse.jgit.lfs.server.test" diff --git a/org.eclipse.jgit.lfs.test/pom.xml b/org.eclipse.jgit.lfs.test/pom.xml index ef9770893..ee74f0ec9 100644 --- a/org.eclipse.jgit.lfs.test/pom.xml +++ b/org.eclipse.jgit.lfs.test/pom.xml @@ -50,7 +50,7 @@ org.eclipse.jgit org.eclipse.jgit-parent - 5.4.0-SNAPSHOT + 5.4.1-SNAPSHOT org.eclipse.jgit.lfs.test diff --git a/org.eclipse.jgit.lfs/META-INF/MANIFEST.MF b/org.eclipse.jgit.lfs/META-INF/MANIFEST.MF index 27792c679..ad36094f4 100644 --- a/org.eclipse.jgit.lfs/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit.lfs/META-INF/MANIFEST.MF @@ -3,33 +3,33 @@ Bundle-ManifestVersion: 2 Bundle-Name: %plugin_name Automatic-Module-Name: org.eclipse.jgit.lfs Bundle-SymbolicName: org.eclipse.jgit.lfs -Bundle-Version: 5.4.0.qualifier +Bundle-Version: 5.4.1.qualifier Bundle-Localization: plugin Bundle-Vendor: %provider_name -Export-Package: org.eclipse.jgit.lfs;version="5.4.0", - org.eclipse.jgit.lfs.errors;version="5.4.0", - org.eclipse.jgit.lfs.internal;version="5.4.0";x-friends:="org.eclipse.jgit.lfs.test,org.eclipse.jgit.lfs.server.fs,org.eclipse.jgit.lfs.server", - org.eclipse.jgit.lfs.lib;version="5.4.0" +Export-Package: org.eclipse.jgit.lfs;version="5.4.1", + org.eclipse.jgit.lfs.errors;version="5.4.1", + org.eclipse.jgit.lfs.internal;version="5.4.1";x-friends:="org.eclipse.jgit.lfs.test,org.eclipse.jgit.lfs.server.fs,org.eclipse.jgit.lfs.server", + org.eclipse.jgit.lfs.lib;version="5.4.1" Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Import-Package: com.google.gson;version="[2.8.2,3.0.0)", com.google.gson.stream;version="[2.8.2,3.0.0)", org.apache.http.impl.client;version="[4.2.6,5.0.0)", org.apache.http.impl.conn;version="[4.2.6,5.0.0)", - org.eclipse.jgit.annotations;version="[5.4.0,5.5.0)";resolution:=optional, - org.eclipse.jgit.api.errors;version="[5.4.0,5.5.0)", - org.eclipse.jgit.attributes;version="[5.4.0,5.5.0)", - org.eclipse.jgit.diff;version="[5.4.0,5.5.0)", - org.eclipse.jgit.errors;version="[5.4.0,5.5.0)", - org.eclipse.jgit.hooks;version="[5.4.0,5.5.0)", - org.eclipse.jgit.internal.storage.file;version="[5.4.0,5.5.0)", - org.eclipse.jgit.lib;version="[5.4.0,5.5.0)", - org.eclipse.jgit.nls;version="[5.4.0,5.5.0)", - org.eclipse.jgit.revwalk;version="[5.4.0,5.5.0)", - org.eclipse.jgit.storage.file;version="[5.4.0,5.5.0)", - org.eclipse.jgit.storage.pack;version="[5.4.0,5.5.0)", - org.eclipse.jgit.transport;version="[5.4.0,5.5.0)", - org.eclipse.jgit.transport.http;version="[5.4.0,5.5.0)", - org.eclipse.jgit.treewalk;version="[5.4.0,5.5.0)", - org.eclipse.jgit.treewalk.filter;version="[5.4.0,5.5.0)", - org.eclipse.jgit.util;version="[5.4.0,5.5.0)", - org.eclipse.jgit.util.io;version="[5.4.0,5.5.0)" + org.eclipse.jgit.annotations;version="[5.4.1,5.5.0)";resolution:=optional, + org.eclipse.jgit.api.errors;version="[5.4.1,5.5.0)", + org.eclipse.jgit.attributes;version="[5.4.1,5.5.0)", + org.eclipse.jgit.diff;version="[5.4.1,5.5.0)", + org.eclipse.jgit.errors;version="[5.4.1,5.5.0)", + org.eclipse.jgit.hooks;version="[5.4.1,5.5.0)", + org.eclipse.jgit.internal.storage.file;version="[5.4.1,5.5.0)", + org.eclipse.jgit.lib;version="[5.4.1,5.5.0)", + org.eclipse.jgit.nls;version="[5.4.1,5.5.0)", + org.eclipse.jgit.revwalk;version="[5.4.1,5.5.0)", + org.eclipse.jgit.storage.file;version="[5.4.1,5.5.0)", + org.eclipse.jgit.storage.pack;version="[5.4.1,5.5.0)", + org.eclipse.jgit.transport;version="[5.4.1,5.5.0)", + org.eclipse.jgit.transport.http;version="[5.4.1,5.5.0)", + org.eclipse.jgit.treewalk;version="[5.4.1,5.5.0)", + org.eclipse.jgit.treewalk.filter;version="[5.4.1,5.5.0)", + org.eclipse.jgit.util;version="[5.4.1,5.5.0)", + org.eclipse.jgit.util.io;version="[5.4.1,5.5.0)" diff --git a/org.eclipse.jgit.lfs/META-INF/SOURCE-MANIFEST.MF b/org.eclipse.jgit.lfs/META-INF/SOURCE-MANIFEST.MF index 7586720c7..517ec1912 100644 --- a/org.eclipse.jgit.lfs/META-INF/SOURCE-MANIFEST.MF +++ b/org.eclipse.jgit.lfs/META-INF/SOURCE-MANIFEST.MF @@ -3,5 +3,5 @@ Bundle-ManifestVersion: 2 Bundle-Name: org.eclipse.jgit.lfs - Sources Bundle-SymbolicName: org.eclipse.jgit.lfs.source Bundle-Vendor: Eclipse.org - JGit -Bundle-Version: 5.4.0.qualifier -Eclipse-SourceBundle: org.eclipse.jgit.lfs;version="5.4.0.qualifier";roots="." +Bundle-Version: 5.4.1.qualifier +Eclipse-SourceBundle: org.eclipse.jgit.lfs;version="5.4.1.qualifier";roots="." diff --git a/org.eclipse.jgit.lfs/pom.xml b/org.eclipse.jgit.lfs/pom.xml index 3b6fe5c63..65532f192 100644 --- a/org.eclipse.jgit.lfs/pom.xml +++ b/org.eclipse.jgit.lfs/pom.xml @@ -50,7 +50,7 @@ org.eclipse.jgit org.eclipse.jgit-parent - 5.4.0-SNAPSHOT + 5.4.1-SNAPSHOT org.eclipse.jgit.lfs diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.feature/feature.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.feature/feature.xml index 1c65b2789..3a4c04875 100644 --- a/org.eclipse.jgit.packaging/org.eclipse.jgit.feature/feature.xml +++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.feature/feature.xml @@ -2,7 +2,7 @@ diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.feature/pom.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.feature/pom.xml index 43b5c87a1..33d8567f4 100644 --- a/org.eclipse.jgit.packaging/org.eclipse.jgit.feature/pom.xml +++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.feature/pom.xml @@ -50,7 +50,7 @@ org.eclipse.jgit jgit.tycho.parent - 5.4.0-SNAPSHOT + 5.4.1-SNAPSHOT org.eclipse.jgit.feature diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.http.apache.feature/feature.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.http.apache.feature/feature.xml index ccf68c483..91264db59 100644 --- a/org.eclipse.jgit.packaging/org.eclipse.jgit.http.apache.feature/feature.xml +++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.http.apache.feature/feature.xml @@ -2,7 +2,7 @@ @@ -23,7 +23,7 @@ - + org.eclipse.jgit jgit.tycho.parent - 5.4.0-SNAPSHOT + 5.4.1-SNAPSHOT org.eclipse.jgit.feature diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.junit.feature/feature.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.junit.feature/feature.xml index 34f0ac988..52faeeca5 100644 --- a/org.eclipse.jgit.packaging/org.eclipse.jgit.junit.feature/feature.xml +++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.junit.feature/feature.xml @@ -2,7 +2,7 @@ @@ -24,7 +24,7 @@ - + org.eclipse.jgit jgit.tycho.parent - 5.4.0-SNAPSHOT + 5.4.1-SNAPSHOT org.eclipse.jgit.feature diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.lfs.feature/feature.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.lfs.feature/feature.xml index 62be3c8f1..39db64a06 100644 --- a/org.eclipse.jgit.packaging/org.eclipse.jgit.lfs.feature/feature.xml +++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.lfs.feature/feature.xml @@ -2,7 +2,7 @@ @@ -23,7 +23,7 @@ - + org.eclipse.jgit jgit.tycho.parent - 5.4.0-SNAPSHOT + 5.4.1-SNAPSHOT org.eclipse.jgit.feature diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.feature/feature.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.feature/feature.xml index 92f0a2475..14bfd0138 100644 --- a/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.feature/feature.xml +++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.feature/feature.xml @@ -2,7 +2,7 @@ @@ -35,9 +35,9 @@ version="0.0.0"/> - - - + + + org.eclipse.jgit jgit.tycho.parent - 5.4.0-SNAPSHOT + 5.4.1-SNAPSHOT org.eclipse.jgit.feature diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.repository/pom.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.repository/pom.xml index a2736d45a..dc2ad15ec 100644 --- a/org.eclipse.jgit.packaging/org.eclipse.jgit.repository/pom.xml +++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.repository/pom.xml @@ -50,7 +50,7 @@ org.eclipse.jgit jgit.tycho.parent - 5.4.0-SNAPSHOT + 5.4.1-SNAPSHOT org.eclipse.jgit.repository diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.source.feature/feature.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.source.feature/feature.xml index 2a6deb2a3..8e8fd8a18 100644 --- a/org.eclipse.jgit.packaging/org.eclipse.jgit.source.feature/feature.xml +++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.source.feature/feature.xml @@ -2,7 +2,7 @@ @@ -23,7 +23,7 @@ - + org.eclipse.jgit jgit.tycho.parent - 5.4.0-SNAPSHOT + 5.4.1-SNAPSHOT org.eclipse.jgit.feature @@ -63,7 +63,7 @@ org.eclipse.jgit.feature org.eclipse.jgit - 5.4.0-SNAPSHOT + 5.4.1-SNAPSHOT diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.ssh.apache.feature/feature.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.ssh.apache.feature/feature.xml index a84d590ca..b7420dc47 100644 --- a/org.eclipse.jgit.packaging/org.eclipse.jgit.ssh.apache.feature/feature.xml +++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.ssh.apache.feature/feature.xml @@ -2,7 +2,7 @@ @@ -23,7 +23,7 @@ - + org.eclipse.jgit jgit.tycho.parent - 5.4.0-SNAPSHOT + 5.4.1-SNAPSHOT org.eclipse.jgit.feature diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/pom.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/pom.xml index 16ff484fa..e632224b9 100644 --- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/pom.xml +++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/pom.xml @@ -49,7 +49,7 @@ org.eclipse.jgit jgit.tycho.parent - 5.4.0-SNAPSHOT + 5.4.1-SNAPSHOT org.eclipse.jgit.target diff --git a/org.eclipse.jgit.packaging/pom.xml b/org.eclipse.jgit.packaging/pom.xml index 325e287d6..ebccb2099 100644 --- a/org.eclipse.jgit.packaging/pom.xml +++ b/org.eclipse.jgit.packaging/pom.xml @@ -53,7 +53,7 @@ org.eclipse.jgit jgit.tycho.parent - 5.4.0-SNAPSHOT + 5.4.1-SNAPSHOT pom JGit Tycho Parent diff --git a/org.eclipse.jgit.pgm.test/META-INF/MANIFEST.MF b/org.eclipse.jgit.pgm.test/META-INF/MANIFEST.MF index c6003a04f..920c0cf89 100644 --- a/org.eclipse.jgit.pgm.test/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit.pgm.test/META-INF/MANIFEST.MF @@ -3,28 +3,28 @@ Bundle-ManifestVersion: 2 Bundle-Name: %plugin_name Automatic-Module-Name: org.eclipse.jgit.pgm.test Bundle-SymbolicName: org.eclipse.jgit.pgm.test -Bundle-Version: 5.4.0.qualifier +Bundle-Version: 5.4.1.qualifier Bundle-Vendor: %provider_name Bundle-Localization: plugin Bundle-ActivationPolicy: lazy Bundle-RequiredExecutionEnvironment: JavaSE-1.8 -Import-Package: org.eclipse.jgit.api;version="[5.4.0,5.5.0)", - org.eclipse.jgit.api.errors;version="[5.4.0,5.5.0)", - org.eclipse.jgit.diff;version="[5.4.0,5.5.0)", - org.eclipse.jgit.dircache;version="[5.4.0,5.5.0)", - org.eclipse.jgit.internal.storage.file;version="5.4.0", - org.eclipse.jgit.junit;version="[5.4.0,5.5.0)", - org.eclipse.jgit.lib;version="[5.4.0,5.5.0)", - org.eclipse.jgit.merge;version="[5.4.0,5.5.0)", - org.eclipse.jgit.pgm;version="[5.4.0,5.5.0)", - org.eclipse.jgit.pgm.internal;version="[5.4.0,5.5.0)", - org.eclipse.jgit.pgm.opt;version="[5.4.0,5.5.0)", - org.eclipse.jgit.revwalk;version="[5.4.0,5.5.0)", - org.eclipse.jgit.storage.file;version="[5.4.0,5.5.0)", - org.eclipse.jgit.transport;version="[5.4.0,5.5.0)", - org.eclipse.jgit.treewalk;version="[5.4.0,5.5.0)", - org.eclipse.jgit.util;version="[5.4.0,5.5.0)", - org.eclipse.jgit.util.io;version="[5.4.0,5.5.0)", +Import-Package: org.eclipse.jgit.api;version="[5.4.1,5.5.0)", + org.eclipse.jgit.api.errors;version="[5.4.1,5.5.0)", + org.eclipse.jgit.diff;version="[5.4.1,5.5.0)", + org.eclipse.jgit.dircache;version="[5.4.1,5.5.0)", + org.eclipse.jgit.internal.storage.file;version="5.4.1", + org.eclipse.jgit.junit;version="[5.4.1,5.5.0)", + org.eclipse.jgit.lib;version="[5.4.1,5.5.0)", + org.eclipse.jgit.merge;version="[5.4.1,5.5.0)", + org.eclipse.jgit.pgm;version="[5.4.1,5.5.0)", + org.eclipse.jgit.pgm.internal;version="[5.4.1,5.5.0)", + org.eclipse.jgit.pgm.opt;version="[5.4.1,5.5.0)", + org.eclipse.jgit.revwalk;version="[5.4.1,5.5.0)", + org.eclipse.jgit.storage.file;version="[5.4.1,5.5.0)", + org.eclipse.jgit.transport;version="[5.4.1,5.5.0)", + org.eclipse.jgit.treewalk;version="[5.4.1,5.5.0)", + org.eclipse.jgit.util;version="[5.4.1,5.5.0)", + org.eclipse.jgit.util.io;version="[5.4.1,5.5.0)", org.hamcrest.core;bundle-version="[1.1.0,2.0.0)", org.junit;version="[4.12,5.0.0)", org.junit.rules;version="[4.12,5.0.0)", diff --git a/org.eclipse.jgit.pgm.test/pom.xml b/org.eclipse.jgit.pgm.test/pom.xml index fcdebdca3..fb493f8c5 100644 --- a/org.eclipse.jgit.pgm.test/pom.xml +++ b/org.eclipse.jgit.pgm.test/pom.xml @@ -50,7 +50,7 @@ org.eclipse.jgit org.eclipse.jgit-parent - 5.4.0-SNAPSHOT + 5.4.1-SNAPSHOT org.eclipse.jgit.pgm.test diff --git a/org.eclipse.jgit.pgm/META-INF/MANIFEST.MF b/org.eclipse.jgit.pgm/META-INF/MANIFEST.MF index 9c98ac4c4..9c313aab8 100644 --- a/org.eclipse.jgit.pgm/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit.pgm/META-INF/MANIFEST.MF @@ -3,7 +3,7 @@ Bundle-ManifestVersion: 2 Bundle-Name: %plugin_name Automatic-Module-Name: org.eclipse.jgit.pgm Bundle-SymbolicName: org.eclipse.jgit.pgm -Bundle-Version: 5.4.0.qualifier +Bundle-Version: 5.4.1.qualifier Bundle-Vendor: %provider_name Bundle-ActivationPolicy: lazy Bundle-Localization: plugin @@ -28,50 +28,50 @@ Import-Package: javax.servlet;version="[3.1.0,4.0.0)", org.eclipse.jetty.util.log;version="[9.4.5,10.0.0)", org.eclipse.jetty.util.security;version="[9.4.5,10.0.0)", org.eclipse.jetty.util.thread;version="[9.4.5,10.0.0)", - org.eclipse.jgit.api;version="[5.4.0,5.5.0)", - org.eclipse.jgit.api.errors;version="[5.4.0,5.5.0)", - org.eclipse.jgit.archive;version="[5.4.0,5.5.0)", - org.eclipse.jgit.awtui;version="[5.4.0,5.5.0)", - org.eclipse.jgit.blame;version="[5.4.0,5.5.0)", - org.eclipse.jgit.diff;version="[5.4.0,5.5.0)", - org.eclipse.jgit.dircache;version="[5.4.0,5.5.0)", - org.eclipse.jgit.errors;version="[5.4.0,5.5.0)", - org.eclipse.jgit.gitrepo;version="[5.4.0,5.5.0)", - org.eclipse.jgit.internal.ketch;version="[5.4.0,5.5.0)", - org.eclipse.jgit.internal.storage.dfs;version="[5.4.0,5.5.0)", - org.eclipse.jgit.internal.storage.file;version="[5.4.0,5.5.0)", - org.eclipse.jgit.internal.storage.io;version="[5.4.0,5.5.0)", - org.eclipse.jgit.internal.storage.pack;version="[5.4.0,5.5.0)", - org.eclipse.jgit.internal.storage.reftable;version="[5.4.0,5.5.0)", - org.eclipse.jgit.internal.storage.reftree;version="[5.4.0,5.5.0)", - org.eclipse.jgit.lfs;version="[5.4.0,5.5.0)", - org.eclipse.jgit.lfs.lib;version="[5.4.0,5.5.0)", - org.eclipse.jgit.lfs.server;version="[5.4.0,5.5.0)", - org.eclipse.jgit.lfs.server.fs;version="[5.4.0,5.5.0)", - org.eclipse.jgit.lfs.server.s3;version="[5.4.0,5.5.0)", - org.eclipse.jgit.lib;version="[5.4.0,5.5.0)", - org.eclipse.jgit.merge;version="[5.4.0,5.5.0)", - org.eclipse.jgit.nls;version="[5.4.0,5.5.0)", - org.eclipse.jgit.notes;version="[5.4.0,5.5.0)", - org.eclipse.jgit.revplot;version="[5.4.0,5.5.0)", - org.eclipse.jgit.revwalk;version="[5.4.0,5.5.0)", - org.eclipse.jgit.revwalk.filter;version="[5.4.0,5.5.0)", - org.eclipse.jgit.storage.file;version="[5.4.0,5.5.0)", - org.eclipse.jgit.storage.pack;version="[5.4.0,5.5.0)", - org.eclipse.jgit.transport;version="[5.4.0,5.5.0)", - org.eclipse.jgit.transport.http.apache;version="[5.4.0,5.5.0)", - org.eclipse.jgit.transport.resolver;version="[5.4.0,5.5.0)", - org.eclipse.jgit.transport.sshd;version="[5.4.0,5.5.0)", - org.eclipse.jgit.treewalk;version="[5.4.0,5.5.0)", - org.eclipse.jgit.treewalk.filter;version="[5.4.0,5.5.0)", - org.eclipse.jgit.util;version="[5.4.0,5.5.0)", - org.eclipse.jgit.util.io;version="[5.4.0,5.5.0)", + org.eclipse.jgit.api;version="[5.4.1,5.5.0)", + org.eclipse.jgit.api.errors;version="[5.4.1,5.5.0)", + org.eclipse.jgit.archive;version="[5.4.1,5.5.0)", + org.eclipse.jgit.awtui;version="[5.4.1,5.5.0)", + org.eclipse.jgit.blame;version="[5.4.1,5.5.0)", + org.eclipse.jgit.diff;version="[5.4.1,5.5.0)", + org.eclipse.jgit.dircache;version="[5.4.1,5.5.0)", + org.eclipse.jgit.errors;version="[5.4.1,5.5.0)", + org.eclipse.jgit.gitrepo;version="[5.4.1,5.5.0)", + org.eclipse.jgit.internal.ketch;version="[5.4.1,5.5.0)", + org.eclipse.jgit.internal.storage.dfs;version="[5.4.1,5.5.0)", + org.eclipse.jgit.internal.storage.file;version="[5.4.1,5.5.0)", + org.eclipse.jgit.internal.storage.io;version="[5.4.1,5.5.0)", + org.eclipse.jgit.internal.storage.pack;version="[5.4.1,5.5.0)", + org.eclipse.jgit.internal.storage.reftable;version="[5.4.1,5.5.0)", + org.eclipse.jgit.internal.storage.reftree;version="[5.4.1,5.5.0)", + org.eclipse.jgit.lfs;version="[5.4.1,5.5.0)", + org.eclipse.jgit.lfs.lib;version="[5.4.1,5.5.0)", + org.eclipse.jgit.lfs.server;version="[5.4.1,5.5.0)", + org.eclipse.jgit.lfs.server.fs;version="[5.4.1,5.5.0)", + org.eclipse.jgit.lfs.server.s3;version="[5.4.1,5.5.0)", + org.eclipse.jgit.lib;version="[5.4.1,5.5.0)", + org.eclipse.jgit.merge;version="[5.4.1,5.5.0)", + org.eclipse.jgit.nls;version="[5.4.1,5.5.0)", + org.eclipse.jgit.notes;version="[5.4.1,5.5.0)", + org.eclipse.jgit.revplot;version="[5.4.1,5.5.0)", + org.eclipse.jgit.revwalk;version="[5.4.1,5.5.0)", + org.eclipse.jgit.revwalk.filter;version="[5.4.1,5.5.0)", + org.eclipse.jgit.storage.file;version="[5.4.1,5.5.0)", + org.eclipse.jgit.storage.pack;version="[5.4.1,5.5.0)", + org.eclipse.jgit.transport;version="[5.4.1,5.5.0)", + org.eclipse.jgit.transport.http.apache;version="[5.4.1,5.5.0)", + org.eclipse.jgit.transport.resolver;version="[5.4.1,5.5.0)", + org.eclipse.jgit.transport.sshd;version="[5.4.1,5.5.0)", + org.eclipse.jgit.treewalk;version="[5.4.1,5.5.0)", + org.eclipse.jgit.treewalk.filter;version="[5.4.1,5.5.0)", + org.eclipse.jgit.util;version="[5.4.1,5.5.0)", + org.eclipse.jgit.util.io;version="[5.4.1,5.5.0)", org.kohsuke.args4j;version="[2.33.0,3.0.0)", org.kohsuke.args4j.spi;version="[2.33.0,3.0.0)" -Export-Package: org.eclipse.jgit.console;version="5.4.0"; +Export-Package: org.eclipse.jgit.console;version="5.4.1"; uses:="org.eclipse.jgit.transport, org.eclipse.jgit.util", - org.eclipse.jgit.pgm;version="5.4.0"; + org.eclipse.jgit.pgm;version="5.4.1"; uses:="org.eclipse.jgit.revwalk, org.eclipse.jgit.treewalk.filter, org.eclipse.jgit.pgm.opt, @@ -82,11 +82,11 @@ Export-Package: org.eclipse.jgit.console;version="5.4.0"; org.eclipse.jgit.treewalk, javax.swing, org.eclipse.jgit.transport", - org.eclipse.jgit.pgm.debug;version="5.4.0"; + org.eclipse.jgit.pgm.debug;version="5.4.1"; uses:="org.eclipse.jgit.util.io, org.eclipse.jgit.pgm", - org.eclipse.jgit.pgm.internal;version="5.4.0";x-friends:="org.eclipse.jgit.pgm.test,org.eclipse.jgit.test", - org.eclipse.jgit.pgm.opt;version="5.4.0"; + org.eclipse.jgit.pgm.internal;version="5.4.1";x-friends:="org.eclipse.jgit.pgm.test,org.eclipse.jgit.test", + org.eclipse.jgit.pgm.opt;version="5.4.1"; uses:="org.eclipse.jgit.lib, org.eclipse.jgit.revwalk, org.kohsuke.args4j.spi, diff --git a/org.eclipse.jgit.pgm/META-INF/SOURCE-MANIFEST.MF b/org.eclipse.jgit.pgm/META-INF/SOURCE-MANIFEST.MF index 4cbd46e0a..9be8fb228 100644 --- a/org.eclipse.jgit.pgm/META-INF/SOURCE-MANIFEST.MF +++ b/org.eclipse.jgit.pgm/META-INF/SOURCE-MANIFEST.MF @@ -3,5 +3,5 @@ Bundle-ManifestVersion: 2 Bundle-Name: org.eclipse.jgit.pgm - Sources Bundle-SymbolicName: org.eclipse.jgit.pgm.source Bundle-Vendor: Eclipse.org - JGit -Bundle-Version: 5.4.0.qualifier -Eclipse-SourceBundle: org.eclipse.jgit.pgm;version="5.4.0.qualifier";roots="." +Bundle-Version: 5.4.1.qualifier +Eclipse-SourceBundle: org.eclipse.jgit.pgm;version="5.4.1.qualifier";roots="." diff --git a/org.eclipse.jgit.pgm/pom.xml b/org.eclipse.jgit.pgm/pom.xml index cf878f458..011a49376 100644 --- a/org.eclipse.jgit.pgm/pom.xml +++ b/org.eclipse.jgit.pgm/pom.xml @@ -50,7 +50,7 @@ org.eclipse.jgit org.eclipse.jgit-parent - 5.4.0-SNAPSHOT + 5.4.1-SNAPSHOT org.eclipse.jgit.pgm diff --git a/org.eclipse.jgit.ssh.apache.test/META-INF/MANIFEST.MF b/org.eclipse.jgit.ssh.apache.test/META-INF/MANIFEST.MF index c1a300e1c..a97bf780f 100644 --- a/org.eclipse.jgit.ssh.apache.test/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit.ssh.apache.test/META-INF/MANIFEST.MF @@ -3,17 +3,17 @@ Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Automatic-Module-Name: org.eclipse.jgit.ssh.apache.test Bundle-SymbolicName: org.eclipse.jgit.ssh.apache.test -Bundle-Version: 5.4.0.qualifier +Bundle-Version: 5.4.1.qualifier Bundle-Vendor: %Provider-Name Bundle-RequiredExecutionEnvironment: JavaSE-1.8 -Import-Package: org.eclipse.jgit.internal.transport.sshd.proxy;version="[5.4.0,5.5.0)", - org.eclipse.jgit.junit;version="[5.4.0,5.5.0)", - org.eclipse.jgit.junit.ssh;version="[5.4.0,5.5.0)", - org.eclipse.jgit.lib;version="[5.4.0,5.5.0)", - org.eclipse.jgit.transport;version="[5.4.0,5.5.0)", - org.eclipse.jgit.transport.ssh;version="[5.4.0,5.5.0)", - org.eclipse.jgit.transport.sshd;version="[5.4.0,5.5.0)", - org.eclipse.jgit.util;version="[5.4.0,5.5.0)", +Import-Package: org.eclipse.jgit.internal.transport.sshd.proxy;version="[5.4.1,5.5.0)", + org.eclipse.jgit.junit;version="[5.4.1,5.5.0)", + org.eclipse.jgit.junit.ssh;version="[5.4.1,5.5.0)", + org.eclipse.jgit.lib;version="[5.4.1,5.5.0)", + org.eclipse.jgit.transport;version="[5.4.1,5.5.0)", + org.eclipse.jgit.transport.ssh;version="[5.4.1,5.5.0)", + org.eclipse.jgit.transport.sshd;version="[5.4.1,5.5.0)", + org.eclipse.jgit.util;version="[5.4.1,5.5.0)", org.junit;version="[4.12,5.0.0)", org.junit.experimental.theories;version="[4.12,5.0.0)", org.junit.runner;version="[4.12,5.0.0)" diff --git a/org.eclipse.jgit.ssh.apache.test/pom.xml b/org.eclipse.jgit.ssh.apache.test/pom.xml index 1fabd6ec7..00bd40343 100644 --- a/org.eclipse.jgit.ssh.apache.test/pom.xml +++ b/org.eclipse.jgit.ssh.apache.test/pom.xml @@ -50,7 +50,7 @@ org.eclipse.jgit org.eclipse.jgit-parent - 5.4.0-SNAPSHOT + 5.4.1-SNAPSHOT org.eclipse.jgit.ssh.apache.test diff --git a/org.eclipse.jgit.ssh.apache/META-INF/MANIFEST.MF b/org.eclipse.jgit.ssh.apache/META-INF/MANIFEST.MF index 5d344f494..1aecee054 100644 --- a/org.eclipse.jgit.ssh.apache/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit.ssh.apache/META-INF/MANIFEST.MF @@ -5,9 +5,9 @@ Automatic-Module-Name: org.eclipse.jgit.ssh.apache Bundle-SymbolicName: org.eclipse.jgit.ssh.apache Bundle-Vendor: %Provider-Name Bundle-ActivationPolicy: lazy -Bundle-Version: 5.4.0.qualifier +Bundle-Version: 5.4.1.qualifier Bundle-RequiredExecutionEnvironment: JavaSE-1.8 -Export-Package: org.eclipse.jgit.internal.transport.sshd;version="5.4.0";x-internal:=true; +Export-Package: org.eclipse.jgit.internal.transport.sshd;version="5.4.1";x-internal:=true; uses:="org.apache.sshd.client, org.apache.sshd.client.auth, org.apache.sshd.client.auth.keyboard, @@ -22,9 +22,9 @@ Export-Package: org.eclipse.jgit.internal.transport.sshd;version="5.4.0";x-inter org.apache.sshd.common.signature, org.apache.sshd.common.util.buffer, org.eclipse.jgit.transport", - org.eclipse.jgit.internal.transport.sshd.auth;version="5.4.0";x-internal:=true, - org.eclipse.jgit.internal.transport.sshd.proxy;version="5.4.0";x-friends:="org.eclipse.jgit.ssh.apache.test", - org.eclipse.jgit.transport.sshd;version="5.4.0"; + org.eclipse.jgit.internal.transport.sshd.auth;version="5.4.1";x-internal:=true, + org.eclipse.jgit.internal.transport.sshd.proxy;version="5.4.1";x-friends:="org.eclipse.jgit.ssh.apache.test", + org.eclipse.jgit.transport.sshd;version="5.4.1"; uses:="org.eclipse.jgit.transport, org.apache.sshd.client.config.hosts, org.apache.sshd.common.keyprovider, @@ -74,12 +74,12 @@ Import-Package: net.i2p.crypto.eddsa;version="[0.3.0,0.4.0)", org.apache.sshd.common.util.net;version="[2.2.0,2.3.0)", org.apache.sshd.common.util.security;version="[2.2.0,2.3.0)", org.apache.sshd.server.auth;version="[2.2.0,2.3.0)", - org.eclipse.jgit.annotations;version="[5.4.0,5.5.0)", - org.eclipse.jgit.errors;version="[5.4.0,5.5.0)", - org.eclipse.jgit.fnmatch;version="[5.4.0,5.5.0)", - org.eclipse.jgit.internal.storage.file;version="[5.4.0,5.5.0)", - org.eclipse.jgit.internal.transport.ssh;version="[5.4.0,5.5.0)", - org.eclipse.jgit.nls;version="[5.4.0,5.5.0)", - org.eclipse.jgit.transport;version="[5.4.0,5.5.0)", - org.eclipse.jgit.util;version="[5.4.0,5.5.0)", + org.eclipse.jgit.annotations;version="[5.4.1,5.5.0)", + org.eclipse.jgit.errors;version="[5.4.1,5.5.0)", + org.eclipse.jgit.fnmatch;version="[5.4.1,5.5.0)", + org.eclipse.jgit.internal.storage.file;version="[5.4.1,5.5.0)", + org.eclipse.jgit.internal.transport.ssh;version="[5.4.1,5.5.0)", + org.eclipse.jgit.nls;version="[5.4.1,5.5.0)", + org.eclipse.jgit.transport;version="[5.4.1,5.5.0)", + org.eclipse.jgit.util;version="[5.4.1,5.5.0)", org.slf4j;version="[1.7.0,2.0.0)" diff --git a/org.eclipse.jgit.ssh.apache/META-INF/SOURCE-MANIFEST.MF b/org.eclipse.jgit.ssh.apache/META-INF/SOURCE-MANIFEST.MF index cfd81da41..deae0d4cf 100644 --- a/org.eclipse.jgit.ssh.apache/META-INF/SOURCE-MANIFEST.MF +++ b/org.eclipse.jgit.ssh.apache/META-INF/SOURCE-MANIFEST.MF @@ -3,5 +3,5 @@ Bundle-ManifestVersion: 2 Bundle-Name: org.eclipse.jgit.ssh.apache - Sources Bundle-SymbolicName: org.eclipse.jgit.ssh.apache.source Bundle-Vendor: Eclipse.org - JGit -Bundle-Version: 5.4.0.qualifier -Eclipse-SourceBundle: org.eclipse.jgit.ssh.apache;version="5.4.0.qualifier";roots="." +Bundle-Version: 5.4.1.qualifier +Eclipse-SourceBundle: org.eclipse.jgit.ssh.apache;version="5.4.1.qualifier";roots="." diff --git a/org.eclipse.jgit.ssh.apache/pom.xml b/org.eclipse.jgit.ssh.apache/pom.xml index 31bf6d7d7..a7f5bae35 100644 --- a/org.eclipse.jgit.ssh.apache/pom.xml +++ b/org.eclipse.jgit.ssh.apache/pom.xml @@ -50,7 +50,7 @@ org.eclipse.jgit org.eclipse.jgit-parent - 5.4.0-SNAPSHOT + 5.4.1-SNAPSHOT org.eclipse.jgit.ssh.apache diff --git a/org.eclipse.jgit.test/META-INF/MANIFEST.MF b/org.eclipse.jgit.test/META-INF/MANIFEST.MF index 1c6211d53..be0103d29 100644 --- a/org.eclipse.jgit.test/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit.test/META-INF/MANIFEST.MF @@ -3,7 +3,7 @@ Bundle-ManifestVersion: 2 Bundle-Name: %plugin_name Automatic-Module-Name: org.eclipse.jgit.test Bundle-SymbolicName: org.eclipse.jgit.test -Bundle-Version: 5.4.0.qualifier +Bundle-Version: 5.4.1.qualifier Bundle-Localization: plugin Bundle-Vendor: %provider_name Bundle-ActivationPolicy: lazy @@ -12,55 +12,55 @@ Import-Package: com.googlecode.javaewah;version="[1.1.6,2.0.0)", com.jcraft.jsch;version="[0.1.54,0.2.0)", net.bytebuddy.dynamic.loading;version="[1.7.0,2.0.0)", org.bouncycastle.util.encoders;version="[1.61.0,2.0.0)", - org.eclipse.jgit.annotations;version="[5.4.0,5.5.0)", - org.eclipse.jgit.api;version="[5.4.0,5.5.0)", - org.eclipse.jgit.api.errors;version="[5.4.0,5.5.0)", - org.eclipse.jgit.attributes;version="[5.4.0,5.5.0)", - org.eclipse.jgit.awtui;version="[5.4.0,5.5.0)", - org.eclipse.jgit.blame;version="[5.4.0,5.5.0)", - org.eclipse.jgit.diff;version="[5.4.0,5.5.0)", - org.eclipse.jgit.dircache;version="[5.4.0,5.5.0)", - org.eclipse.jgit.errors;version="[5.4.0,5.5.0)", - org.eclipse.jgit.events;version="[5.4.0,5.5.0)", - org.eclipse.jgit.fnmatch;version="[5.4.0,5.5.0)", - org.eclipse.jgit.gitrepo;version="[5.4.0,5.5.0)", - org.eclipse.jgit.hooks;version="[5.4.0,5.5.0)", - org.eclipse.jgit.ignore;version="[5.4.0,5.5.0)", - org.eclipse.jgit.ignore.internal;version="[5.4.0,5.5.0)", - org.eclipse.jgit.internal;version="[5.4.0,5.5.0)", - org.eclipse.jgit.internal.fsck;version="[5.4.0,5.5.0)", - org.eclipse.jgit.internal.storage.dfs;version="[5.4.0,5.5.0)", - org.eclipse.jgit.internal.storage.file;version="[5.4.0,5.5.0)", - org.eclipse.jgit.internal.storage.io;version="[5.4.0,5.5.0)", - org.eclipse.jgit.internal.storage.pack;version="[5.4.0,5.5.0)", - org.eclipse.jgit.internal.storage.reftable;version="[5.4.0,5.5.0)", - org.eclipse.jgit.internal.storage.reftree;version="[5.4.0,5.5.0)", - org.eclipse.jgit.internal.transport.http;version="[5.4.0,5.5.0)", - org.eclipse.jgit.internal.transport.parser;version="[5.4.0,5.5.0)", - org.eclipse.jgit.junit;version="[5.4.0,5.5.0)", - org.eclipse.jgit.junit.ssh;version="[5.4.0,5.5.0)", - org.eclipse.jgit.lfs;version="[5.4.0,5.5.0)", - org.eclipse.jgit.lib;version="[5.4.0,5.5.0)", - org.eclipse.jgit.merge;version="[5.4.0,5.5.0)", - org.eclipse.jgit.nls;version="[5.4.0,5.5.0)", - org.eclipse.jgit.notes;version="[5.4.0,5.5.0)", - org.eclipse.jgit.patch;version="[5.4.0,5.5.0)", - org.eclipse.jgit.pgm;version="[5.4.0,5.5.0)", - org.eclipse.jgit.pgm.internal;version="[5.4.0,5.5.0)", - org.eclipse.jgit.revplot;version="[5.4.0,5.5.0)", - org.eclipse.jgit.revwalk;version="[5.4.0,5.5.0)", - org.eclipse.jgit.revwalk.filter;version="[5.4.0,5.5.0)", - org.eclipse.jgit.storage.file;version="[5.4.0,5.5.0)", - org.eclipse.jgit.storage.pack;version="[5.4.0,5.5.0)", - org.eclipse.jgit.submodule;version="[5.4.0,5.5.0)", - org.eclipse.jgit.transport;version="[5.4.0,5.5.0)", - org.eclipse.jgit.transport.http;version="[5.4.0,5.5.0)", - org.eclipse.jgit.transport.resolver;version="[5.4.0,5.5.0)", - org.eclipse.jgit.treewalk;version="[5.4.0,5.5.0)", - org.eclipse.jgit.treewalk.filter;version="[5.4.0,5.5.0)", - org.eclipse.jgit.util;version="[5.4.0,5.5.0)", - org.eclipse.jgit.util.io;version="[5.4.0,5.5.0)", - org.eclipse.jgit.util.sha1;version="[5.4.0,5.5.0)", + org.eclipse.jgit.annotations;version="[5.4.1,5.5.0)", + org.eclipse.jgit.api;version="[5.4.1,5.5.0)", + org.eclipse.jgit.api.errors;version="[5.4.1,5.5.0)", + org.eclipse.jgit.attributes;version="[5.4.1,5.5.0)", + org.eclipse.jgit.awtui;version="[5.4.1,5.5.0)", + org.eclipse.jgit.blame;version="[5.4.1,5.5.0)", + org.eclipse.jgit.diff;version="[5.4.1,5.5.0)", + org.eclipse.jgit.dircache;version="[5.4.1,5.5.0)", + org.eclipse.jgit.errors;version="[5.4.1,5.5.0)", + org.eclipse.jgit.events;version="[5.4.1,5.5.0)", + org.eclipse.jgit.fnmatch;version="[5.4.1,5.5.0)", + org.eclipse.jgit.gitrepo;version="[5.4.1,5.5.0)", + org.eclipse.jgit.hooks;version="[5.4.1,5.5.0)", + org.eclipse.jgit.ignore;version="[5.4.1,5.5.0)", + org.eclipse.jgit.ignore.internal;version="[5.4.1,5.5.0)", + org.eclipse.jgit.internal;version="[5.4.1,5.5.0)", + org.eclipse.jgit.internal.fsck;version="[5.4.1,5.5.0)", + org.eclipse.jgit.internal.storage.dfs;version="[5.4.1,5.5.0)", + org.eclipse.jgit.internal.storage.file;version="[5.4.1,5.5.0)", + org.eclipse.jgit.internal.storage.io;version="[5.4.1,5.5.0)", + org.eclipse.jgit.internal.storage.pack;version="[5.4.1,5.5.0)", + org.eclipse.jgit.internal.storage.reftable;version="[5.4.1,5.5.0)", + org.eclipse.jgit.internal.storage.reftree;version="[5.4.1,5.5.0)", + org.eclipse.jgit.internal.transport.http;version="[5.4.1,5.5.0)", + org.eclipse.jgit.internal.transport.parser;version="[5.4.1,5.5.0)", + org.eclipse.jgit.junit;version="[5.4.1,5.5.0)", + org.eclipse.jgit.junit.ssh;version="[5.4.1,5.5.0)", + org.eclipse.jgit.lfs;version="[5.4.1,5.5.0)", + org.eclipse.jgit.lib;version="[5.4.1,5.5.0)", + org.eclipse.jgit.merge;version="[5.4.1,5.5.0)", + org.eclipse.jgit.nls;version="[5.4.1,5.5.0)", + org.eclipse.jgit.notes;version="[5.4.1,5.5.0)", + org.eclipse.jgit.patch;version="[5.4.1,5.5.0)", + org.eclipse.jgit.pgm;version="[5.4.1,5.5.0)", + org.eclipse.jgit.pgm.internal;version="[5.4.1,5.5.0)", + org.eclipse.jgit.revplot;version="[5.4.1,5.5.0)", + org.eclipse.jgit.revwalk;version="[5.4.1,5.5.0)", + org.eclipse.jgit.revwalk.filter;version="[5.4.1,5.5.0)", + org.eclipse.jgit.storage.file;version="[5.4.1,5.5.0)", + org.eclipse.jgit.storage.pack;version="[5.4.1,5.5.0)", + org.eclipse.jgit.submodule;version="[5.4.1,5.5.0)", + org.eclipse.jgit.transport;version="[5.4.1,5.5.0)", + org.eclipse.jgit.transport.http;version="[5.4.1,5.5.0)", + org.eclipse.jgit.transport.resolver;version="[5.4.1,5.5.0)", + org.eclipse.jgit.treewalk;version="[5.4.1,5.5.0)", + org.eclipse.jgit.treewalk.filter;version="[5.4.1,5.5.0)", + org.eclipse.jgit.util;version="[5.4.1,5.5.0)", + org.eclipse.jgit.util.io;version="[5.4.1,5.5.0)", + org.eclipse.jgit.util.sha1;version="[5.4.1,5.5.0)", org.junit;version="[4.12,5.0.0)", org.junit.experimental.theories;version="[4.12,5.0.0)", org.junit.rules;version="[4.12,5.0.0)", @@ -74,4 +74,4 @@ Import-Package: com.googlecode.javaewah;version="[1.1.6,2.0.0)", org.slf4j;version="[1.7.0,2.0.0)" Require-Bundle: org.hamcrest.core;bundle-version="[1.1.0,2.0.0)", org.hamcrest.library;bundle-version="[1.1.0,2.0.0)" -Export-Package: org.eclipse.jgit.transport.ssh;version="5.4.0";x-friends:="org.eclipse.jgit.ssh.apache.test" +Export-Package: org.eclipse.jgit.transport.ssh;version="5.4.1";x-friends:="org.eclipse.jgit.ssh.apache.test" diff --git a/org.eclipse.jgit.test/pom.xml b/org.eclipse.jgit.test/pom.xml index 624875618..9e5040a24 100644 --- a/org.eclipse.jgit.test/pom.xml +++ b/org.eclipse.jgit.test/pom.xml @@ -52,7 +52,7 @@ org.eclipse.jgit org.eclipse.jgit-parent - 5.4.0-SNAPSHOT + 5.4.1-SNAPSHOT org.eclipse.jgit.test diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/FileSnapshotTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/FileSnapshotTest.java index 9ceaa345d..5ebdeb6e8 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/FileSnapshotTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/FileSnapshotTest.java @@ -42,16 +42,22 @@ */ package org.eclipse.jgit.internal.storage.file; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.StandardCopyOption; +import java.nio.file.attribute.FileTime; import java.util.ArrayList; import java.util.List; import org.eclipse.jgit.util.FileUtils; +import org.eclipse.jgit.util.SystemReader; import org.junit.After; +import org.junit.Assume; import org.junit.Before; import org.junit.Test; @@ -121,12 +127,59 @@ public void testNewFileWithWait() throws Exception { @Test public void testNewFileNoWait() throws Exception { File f1 = createFile("newfile"); - waitNextSec(f1); FileSnapshot save = FileSnapshot.save(f1); - Thread.sleep(1500); assertTrue(save.isModified(f1)); } + /** + * Simulate packfile replacement in same file which may occur if set of + * objects in the pack is the same but pack config was different. On Posix + * filesystems this should change the inode (filekey in java.nio + * terminology). + * + * @throws Exception + */ + @Test + public void testSimulatePackfileReplacement() throws Exception { + Assume.assumeFalse(SystemReader.getInstance().isWindows()); + File f1 = createFile("file"); // inode y + File f2 = createFile("fool"); // Guarantees new inode x + // wait on f2 since this method resets lastModified of the file + // and leaves lastModified of f1 untouched + waitNextSec(f2); + waitNextSec(f2); + FileTime timestamp = Files.getLastModifiedTime(f1.toPath()); + FileSnapshot save = FileSnapshot.save(f1); + Files.move(f2.toPath(), f1.toPath(), // Now "file" is inode x + StandardCopyOption.REPLACE_EXISTING, + StandardCopyOption.ATOMIC_MOVE); + Files.setLastModifiedTime(f1.toPath(), timestamp); + assertTrue(save.isModified(f1)); + assertTrue("unexpected change of fileKey", save.wasFileKeyChanged()); + assertFalse("unexpected size change", save.wasSizeChanged()); + assertFalse("unexpected lastModified change", + save.wasLastModifiedChanged()); + assertFalse("lastModified was unexpectedly racily clean", + save.wasLastModifiedRacilyClean()); + } + + /** + * Append a character to a file to change its size and set original + * lastModified + * + * @throws Exception + */ + @Test + public void testFileSizeChanged() throws Exception { + File f = createFile("file"); + FileTime timestamp = Files.getLastModifiedTime(f.toPath()); + FileSnapshot save = FileSnapshot.save(f); + append(f, (byte) 'x'); + Files.setLastModifiedTime(f.toPath(), timestamp); + assertTrue(save.isModified(f)); + assertTrue(save.wasSizeChanged()); + } + private File createFile(String string) throws IOException { trash.mkdirs(); File f = File.createTempFile(string, "tdat", trash); diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/PackFileSnapshotTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/PackFileSnapshotTest.java new file mode 100644 index 000000000..a1433e9fe --- /dev/null +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/PackFileSnapshotTest.java @@ -0,0 +1,354 @@ +/* + * Copyright (C) 2019, Matthias Sohn + * and other copyright owners as documented in the project's IP log. + * + * This program and the accompanying materials are made available + * under the terms of the Eclipse Distribution License v1.0 which + * accompanies this distribution, is reproduced below, and is + * available at http://www.eclipse.org/org/documents/edl-v10.php + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or + * without modification, are permitted provided that the following + * conditions are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * + * - Neither the name of the Eclipse Foundation, Inc. nor the + * names of its contributors may be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.eclipse.jgit.internal.storage.file; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assume.assumeFalse; +import static org.junit.Assume.assumeTrue; + +import java.io.File; +import java.io.IOException; +import java.io.OutputStream; +import java.io.Writer; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; +import java.nio.file.StandardOpenOption; +//import java.nio.file.attribute.BasicFileAttributes; +import java.text.ParseException; +import java.util.Collection; +import java.util.Iterator; +import java.util.Random; +import java.util.zip.Deflater; + +import org.eclipse.jgit.api.GarbageCollectCommand; +import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.api.errors.AbortedByHookException; +import org.eclipse.jgit.api.errors.ConcurrentRefUpdateException; +import org.eclipse.jgit.api.errors.GitAPIException; +import org.eclipse.jgit.api.errors.NoFilepatternException; +import org.eclipse.jgit.api.errors.NoHeadException; +import org.eclipse.jgit.api.errors.NoMessageException; +import org.eclipse.jgit.api.errors.UnmergedPathsException; +import org.eclipse.jgit.api.errors.WrongRepositoryStateException; +import org.eclipse.jgit.junit.RepositoryTestCase; +import org.eclipse.jgit.lib.AnyObjectId; +import org.eclipse.jgit.lib.ConfigConstants; +import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.storage.file.FileBasedConfig; +import org.eclipse.jgit.storage.pack.PackConfig; +import org.junit.Test; + +public class PackFileSnapshotTest extends RepositoryTestCase { + + private static ObjectId unknownID = ObjectId + .fromString("1234567890123456789012345678901234567890"); + + @Test + public void testSamePackDifferentCompressionDetectChecksumChanged() + throws Exception { + Git git = Git.wrap(db); + File f = writeTrashFile("file", "foobar "); + for (int i = 0; i < 10; i++) { + appendRandomLine(f); + git.add().addFilepattern("file").call(); + git.commit().setMessage("message" + i).call(); + } + + FileBasedConfig c = db.getConfig(); + c.setInt(ConfigConstants.CONFIG_GC_SECTION, null, + ConfigConstants.CONFIG_KEY_AUTOPACKLIMIT, 1); + c.save(); + Collection packs = gc(Deflater.NO_COMPRESSION); + assertEquals("expected 1 packfile after gc", 1, packs.size()); + PackFile p1 = packs.iterator().next(); + PackFileSnapshot snapshot = p1.getFileSnapshot(); + + packs = gc(Deflater.BEST_COMPRESSION); + assertEquals("expected 1 packfile after gc", 1, packs.size()); + PackFile p2 = packs.iterator().next(); + File pf = p2.getPackFile(); + + // changing compression level with aggressive gc may change size, + // fileKey (on *nix) and checksum. Hence FileSnapshot.isModified can + // return true already based on size or fileKey. + // So the only thing we can test here is that we ensure that checksum + // also changed when we read it here in this test + assertTrue("expected snapshot to detect modified pack", + snapshot.isModified(pf)); + assertTrue("expected checksum changed", snapshot.isChecksumChanged(pf)); + } + + private void appendRandomLine(File f, int length, Random r) + throws IOException { + try (Writer w = Files.newBufferedWriter(f.toPath(), + StandardOpenOption.APPEND)) { + appendRandomLine(w, length, r); + } + } + + private void appendRandomLine(File f) throws IOException { + appendRandomLine(f, 5, new Random()); + } + + private void appendRandomLine(Writer w, int len, Random r) + throws IOException { + final int c1 = 32; // ' ' + int c2 = 126; // '~' + for (int i = 0; i < len; i++) { + w.append((char) (c1 + r.nextInt(1 + c2 - c1))); + } + } + + private ObjectId createTestRepo(int testDataSeed, int testDataLength) + throws IOException, GitAPIException, NoFilepatternException, + NoHeadException, NoMessageException, UnmergedPathsException, + ConcurrentRefUpdateException, WrongRepositoryStateException, + AbortedByHookException { + // Create a repo with two commits and one file. Each commit adds + // testDataLength number of bytes. Data are random bytes. Since the + // seed for the random number generator is specified we will get + // the same set of bytes for every run and for every platform + Random r = new Random(testDataSeed); + Git git = Git.wrap(db); + File f = writeTrashFile("file", "foobar "); + appendRandomLine(f, testDataLength, r); + git.add().addFilepattern("file").call(); + git.commit().setMessage("message1").call(); + appendRandomLine(f, testDataLength, r); + git.add().addFilepattern("file").call(); + return git.commit().setMessage("message2").call().getId(); + } + + // Try repacking so fast that you get two new packs which differ only in + // content/chksum but have same name, size and lastmodified. + // Since this is done with standard gc (which creates new tmp files and + // renames them) the filekeys of the new packfiles differ helping jgit + // to detect the fast modification + @Test + public void testDetectModificationAlthoughSameSizeAndModificationtime() + throws Exception { + int testDataSeed = 1; + int testDataLength = 100; + FileBasedConfig config = db.getConfig(); + // don't use mtime of the parent folder to detect pack file + // modification. + config.setBoolean(ConfigConstants.CONFIG_CORE_SECTION, null, + ConfigConstants.CONFIG_KEY_TRUSTFOLDERSTAT, false); + config.save(); + + createTestRepo(testDataSeed, testDataLength); + + // repack to create initial packfile + PackFile pf = repackAndCheck(5, null, null, null); + Path packFilePath = pf.getPackFile().toPath(); + AnyObjectId chk1 = pf.getPackChecksum(); + String name = pf.getPackName(); + Long length = Long.valueOf(pf.getPackFile().length()); + long m1 = packFilePath.toFile().lastModified(); + + // Wait for a filesystem timer tick to enhance probability the rest of + // this test is done before the filesystem timer ticks again. + fsTick(packFilePath.toFile()); + + // Repack to create packfile with same name, length. Lastmodified and + // content and checksum are different since compression level differs + AnyObjectId chk2 = repackAndCheck(6, name, length, chk1) + .getPackChecksum(); + long m2 = packFilePath.toFile().lastModified(); + assumeFalse(m2 == m1); + + // Repack to create packfile with same name, length. Lastmodified is + // equal to the previous one because we are in the same filesystem timer + // slot. Content and its checksum are different + AnyObjectId chk3 = repackAndCheck(7, name, length, chk2) + .getPackChecksum(); + long m3 = packFilePath.toFile().lastModified(); + + // ask for an unknown git object to force jgit to rescan the list of + // available packs. If we would ask for a known objectid then JGit would + // skip searching for new/modified packfiles + db.getObjectDatabase().has(unknownID); + assertEquals(chk3, getSinglePack(db.getObjectDatabase().getPacks()) + .getPackChecksum()); + assumeTrue(m3 == m2); + } + + // Try repacking so fast that we get two new packs which differ only in + // content and checksum but have same name, size and lastmodified. + // To avoid that JGit detects modification by checking the filekey create + // two new packfiles upfront and create copies of them. Then modify the + // packfiles in-place by opening them for write and then copying the + // content. + @Test + public void testDetectModificationAlthoughSameSizeAndModificationtimeAndFileKey() + throws Exception { + int testDataSeed = 1; + int testDataLength = 100; + FileBasedConfig config = db.getConfig(); + config.setBoolean(ConfigConstants.CONFIG_CORE_SECTION, null, + ConfigConstants.CONFIG_KEY_TRUSTFOLDERSTAT, false); + config.save(); + + createTestRepo(testDataSeed, testDataLength); + + // Repack to create initial packfile. Make a copy of it + PackFile pf = repackAndCheck(5, null, null, null); + Path packFilePath = pf.getPackFile().toPath(); + Path packFileBasePath = packFilePath.resolveSibling( + packFilePath.getFileName().toString().replaceAll(".pack", "")); + AnyObjectId chk1 = pf.getPackChecksum(); + String name = pf.getPackName(); + Long length = Long.valueOf(pf.getPackFile().length()); + copyPack(packFileBasePath, "", ".copy1"); + + // Repack to create second packfile. Make a copy of it + AnyObjectId chk2 = repackAndCheck(6, name, length, chk1) + .getPackChecksum(); + copyPack(packFileBasePath, "", ".copy2"); + + // Repack to create third packfile + AnyObjectId chk3 = repackAndCheck(7, name, length, chk2) + .getPackChecksum(); + long m3 = packFilePath.toFile().lastModified(); + db.getObjectDatabase().has(unknownID); + assertEquals(chk3, getSinglePack(db.getObjectDatabase().getPacks()) + .getPackChecksum()); + + // Wait for a filesystem timer tick to enhance probability the rest of + // this test is done before the filesystem timer ticks. + fsTick(packFilePath.toFile()); + + // Copy copy2 to packfile data to force modification of packfile without + // changing the packfile's filekey. + copyPack(packFileBasePath, ".copy2", ""); + long m2 = packFilePath.toFile().lastModified(); + assumeFalse(m3 == m2); + + db.getObjectDatabase().has(unknownID); + assertEquals(chk2, getSinglePack(db.getObjectDatabase().getPacks()) + .getPackChecksum()); + + // Copy copy2 to packfile data to force modification of packfile without + // changing the packfile's filekey. + copyPack(packFileBasePath, ".copy1", ""); + long m1 = packFilePath.toFile().lastModified(); + assumeTrue(m2 == m1); + db.getObjectDatabase().has(unknownID); + assertEquals(chk1, getSinglePack(db.getObjectDatabase().getPacks()) + .getPackChecksum()); + } + + // Copy file from src to dst but avoid creating a new File (with new + // FileKey) if dst already exists + private Path copyFile(Path src, Path dst) throws IOException { + if (Files.exists(dst)) { + dst.toFile().setWritable(true); + try (OutputStream dstOut = Files.newOutputStream(dst)) { + Files.copy(src, dstOut); + return dst; + } + } else { + return Files.copy(src, dst, StandardCopyOption.REPLACE_EXISTING); + } + } + + private Path copyPack(Path base, String srcSuffix, String dstSuffix) + throws IOException { + copyFile(Paths.get(base + ".idx" + srcSuffix), + Paths.get(base + ".idx" + dstSuffix)); + copyFile(Paths.get(base + ".bitmap" + srcSuffix), + Paths.get(base + ".bitmap" + dstSuffix)); + return copyFile(Paths.get(base + ".pack" + srcSuffix), + Paths.get(base + ".pack" + dstSuffix)); + } + + private PackFile repackAndCheck(int compressionLevel, String oldName, + Long oldLength, AnyObjectId oldChkSum) + throws IOException, ParseException { + PackFile p = getSinglePack(gc(compressionLevel)); + File pf = p.getPackFile(); + // The following two assumptions should not cause the test to fail. If + // on a certain platform we get packfiles (containing the same git + // objects) where the lengths differ or the checksums don't differ we + // just skip this test. A reason for that could be that compression + // works differently or random number generator works differently. Then + // we have to search for more consistent test data or checkin these + // packfiles as test resources + assumeTrue(oldLength == null || pf.length() == oldLength.longValue()); + assumeTrue(oldChkSum == null || !p.getPackChecksum().equals(oldChkSum)); + assertTrue(oldName == null || p.getPackName().equals(oldName)); + return p; + } + + private PackFile getSinglePack(Collection packs) { + Iterator pIt = packs.iterator(); + PackFile p = pIt.next(); + assertFalse(pIt.hasNext()); + return p; + } + + private Collection gc(int compressionLevel) + throws IOException, ParseException { + GC gc = new GC(db); + PackConfig pc = new PackConfig(db.getConfig()); + pc.setCompressionLevel(compressionLevel); + + pc.setSinglePack(true); + + // --aggressive + pc.setDeltaSearchWindowSize( + GarbageCollectCommand.DEFAULT_GC_AGGRESSIVE_WINDOW); + pc.setMaxDeltaDepth(GarbageCollectCommand.DEFAULT_GC_AGGRESSIVE_DEPTH); + pc.setReuseObjects(false); + + gc.setPackConfig(pc); + gc.setExpireAgeMillis(0); + gc.setPackExpireAgeMillis(0); + return gc.gc(); + } + +} diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/FSTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/FSTest.java index 5293ca466..6dfa6ef5a 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/FSTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/FSTest.java @@ -46,17 +46,24 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; -import static org.junit.Assume.assumeTrue; import static org.junit.Assume.assumeNoException; +import static org.junit.Assume.assumeTrue; import java.io.File; import java.io.IOException; import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.InvalidPathException; +import java.nio.file.Path; +import java.nio.file.attribute.FileTime; import java.nio.file.attribute.PosixFileAttributeView; import java.nio.file.attribute.PosixFilePermission; +import java.time.Duration; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.util.Locale; import java.util.Set; +import java.util.concurrent.TimeUnit; import org.eclipse.jgit.errors.CommandFailedException; import org.eclipse.jgit.junit.RepositoryTestCase; @@ -215,4 +222,34 @@ public void testReadPipeCommandStartFailure() new String[] { "this-command-does-not-exist" }, Charset.defaultCharset().name()); } + + @Test + public void testFsTimestampResolution() throws Exception { + DateTimeFormatter formatter = DateTimeFormatter + .ofPattern("uuuu-MMM-dd HH:mm:ss.nnnnnnnnn", Locale.ENGLISH) + .withZone(ZoneId.systemDefault()); + Path dir = Files.createTempDirectory("probe-filesystem"); + Duration resolution = FS.getFsTimerResolution(dir); + long resolutionNs = resolution.toNanos(); + assertTrue(resolutionNs > 0); + for (int i = 0; i < 10; i++) { + Path f = null; + try { + f = dir.resolve("testTimestampResolution" + i); + Files.createFile(f); + FileUtils.touch(f); + FileTime t1 = Files.getLastModifiedTime(f); + TimeUnit.NANOSECONDS.sleep(resolutionNs); + FileUtils.touch(f); + FileTime t2 = Files.getLastModifiedTime(f); + assertTrue(String.format( + "expected t2=%s to be larger than t1=%s\nsince file timestamp resolution was measured to be %,d ns", + formatter.format(t2.toInstant()), + formatter.format(t1.toInstant()), + Long.valueOf(resolutionNs)), t2.compareTo(t1) > 0); + } finally { + Files.delete(f); + } + } + } } diff --git a/org.eclipse.jgit.ui/META-INF/MANIFEST.MF b/org.eclipse.jgit.ui/META-INF/MANIFEST.MF index 702783825..531d28779 100644 --- a/org.eclipse.jgit.ui/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit.ui/META-INF/MANIFEST.MF @@ -4,14 +4,14 @@ Bundle-ManifestVersion: 2 Bundle-Name: %plugin_name Automatic-Module-Name: org.eclipse.jgit.ui Bundle-SymbolicName: org.eclipse.jgit.ui -Bundle-Version: 5.4.0.qualifier +Bundle-Version: 5.4.1.qualifier Bundle-Vendor: %provider_name Bundle-RequiredExecutionEnvironment: JavaSE-1.8 -Export-Package: org.eclipse.jgit.awtui;version="5.4.0" -Import-Package: org.eclipse.jgit.errors;version="[5.4.0,5.5.0)", - org.eclipse.jgit.lib;version="[5.4.0,5.5.0)", - org.eclipse.jgit.nls;version="[5.4.0,5.5.0)", - org.eclipse.jgit.revplot;version="[5.4.0,5.5.0)", - org.eclipse.jgit.revwalk;version="[5.4.0,5.5.0)", - org.eclipse.jgit.transport;version="[5.4.0,5.5.0)", - org.eclipse.jgit.util;version="[5.4.0,5.5.0)" +Export-Package: org.eclipse.jgit.awtui;version="5.4.1" +Import-Package: org.eclipse.jgit.errors;version="[5.4.1,5.5.0)", + org.eclipse.jgit.lib;version="[5.4.1,5.5.0)", + org.eclipse.jgit.nls;version="[5.4.1,5.5.0)", + org.eclipse.jgit.revplot;version="[5.4.1,5.5.0)", + org.eclipse.jgit.revwalk;version="[5.4.1,5.5.0)", + org.eclipse.jgit.transport;version="[5.4.1,5.5.0)", + org.eclipse.jgit.util;version="[5.4.1,5.5.0)" diff --git a/org.eclipse.jgit.ui/META-INF/SOURCE-MANIFEST.MF b/org.eclipse.jgit.ui/META-INF/SOURCE-MANIFEST.MF index 82ded94c2..2fdfc4ef3 100644 --- a/org.eclipse.jgit.ui/META-INF/SOURCE-MANIFEST.MF +++ b/org.eclipse.jgit.ui/META-INF/SOURCE-MANIFEST.MF @@ -3,5 +3,5 @@ Bundle-ManifestVersion: 2 Bundle-Name: org.eclipse.jgit.ui - Sources Bundle-SymbolicName: org.eclipse.jgit.ui.source Bundle-Vendor: Eclipse.org - JGit -Bundle-Version: 5.4.0.qualifier -Eclipse-SourceBundle: org.eclipse.jgit.ui;version="5.4.0.qualifier";roots="." +Bundle-Version: 5.4.1.qualifier +Eclipse-SourceBundle: org.eclipse.jgit.ui;version="5.4.1.qualifier";roots="." diff --git a/org.eclipse.jgit.ui/pom.xml b/org.eclipse.jgit.ui/pom.xml index 0177f2573..990dfe470 100644 --- a/org.eclipse.jgit.ui/pom.xml +++ b/org.eclipse.jgit.ui/pom.xml @@ -52,7 +52,7 @@ org.eclipse.jgit org.eclipse.jgit-parent - 5.4.0-SNAPSHOT + 5.4.1-SNAPSHOT org.eclipse.jgit.ui diff --git a/org.eclipse.jgit/.settings/.api_filters b/org.eclipse.jgit/.settings/.api_filters index ed36dde8b..fc326d446 100644 --- a/org.eclipse.jgit/.settings/.api_filters +++ b/org.eclipse.jgit/.settings/.api_filters @@ -38,6 +38,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -46,6 +102,26 @@ + + + + + + + + + + + + + + + + + + + + @@ -68,23 +144,19 @@ - - + + - - + + - + + + - - - - - - - - + + diff --git a/org.eclipse.jgit/META-INF/MANIFEST.MF b/org.eclipse.jgit/META-INF/MANIFEST.MF index 893f0d430..493cab4d2 100644 --- a/org.eclipse.jgit/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit/META-INF/MANIFEST.MF @@ -3,12 +3,12 @@ Bundle-ManifestVersion: 2 Bundle-Name: %plugin_name Automatic-Module-Name: org.eclipse.jgit Bundle-SymbolicName: org.eclipse.jgit -Bundle-Version: 5.4.0.qualifier +Bundle-Version: 5.4.1.qualifier Bundle-Localization: plugin Bundle-Vendor: %provider_name Bundle-ActivationPolicy: lazy -Export-Package: org.eclipse.jgit.annotations;version="5.4.0", - org.eclipse.jgit.api;version="5.4.0"; +Export-Package: org.eclipse.jgit.annotations;version="5.4.1", + org.eclipse.jgit.api;version="5.4.1"; uses:="org.eclipse.jgit.revwalk, org.eclipse.jgit.treewalk.filter, org.eclipse.jgit.diff, @@ -22,53 +22,53 @@ Export-Package: org.eclipse.jgit.annotations;version="5.4.0", org.eclipse.jgit.submodule, org.eclipse.jgit.transport, org.eclipse.jgit.merge", - org.eclipse.jgit.api.errors;version="5.4.0";uses:="org.eclipse.jgit.lib,org.eclipse.jgit.errors", - org.eclipse.jgit.attributes;version="5.4.0", - org.eclipse.jgit.blame;version="5.4.0"; + org.eclipse.jgit.api.errors;version="5.4.1";uses:="org.eclipse.jgit.lib,org.eclipse.jgit.errors", + org.eclipse.jgit.attributes;version="5.4.1", + org.eclipse.jgit.blame;version="5.4.1"; uses:="org.eclipse.jgit.lib, org.eclipse.jgit.revwalk, org.eclipse.jgit.treewalk.filter, org.eclipse.jgit.diff", - org.eclipse.jgit.diff;version="5.4.0"; + org.eclipse.jgit.diff;version="5.4.1"; uses:="org.eclipse.jgit.patch, org.eclipse.jgit.lib, org.eclipse.jgit.treewalk, org.eclipse.jgit.revwalk, org.eclipse.jgit.treewalk.filter, org.eclipse.jgit.util", - org.eclipse.jgit.dircache;version="5.4.0"; + org.eclipse.jgit.dircache;version="5.4.1"; uses:="org.eclipse.jgit.lib, org.eclipse.jgit.treewalk, org.eclipse.jgit.util, org.eclipse.jgit.events, org.eclipse.jgit.attributes", - org.eclipse.jgit.errors;version="5.4.0"; + org.eclipse.jgit.errors;version="5.4.1"; uses:="org.eclipse.jgit.lib, org.eclipse.jgit.internal.storage.pack, org.eclipse.jgit.transport, org.eclipse.jgit.dircache", - org.eclipse.jgit.events;version="5.4.0";uses:="org.eclipse.jgit.lib", - org.eclipse.jgit.fnmatch;version="5.4.0", - org.eclipse.jgit.gitrepo;version="5.4.0"; + org.eclipse.jgit.events;version="5.4.1";uses:="org.eclipse.jgit.lib", + org.eclipse.jgit.fnmatch;version="5.4.1", + org.eclipse.jgit.gitrepo;version="5.4.1"; uses:="org.eclipse.jgit.api, org.eclipse.jgit.lib, org.eclipse.jgit.revwalk, org.xml.sax.helpers, org.xml.sax", - org.eclipse.jgit.gitrepo.internal;version="5.4.0";x-internal:=true, - org.eclipse.jgit.hooks;version="5.4.0";uses:="org.eclipse.jgit.lib", - org.eclipse.jgit.ignore;version="5.4.0", - org.eclipse.jgit.ignore.internal;version="5.4.0";x-friends:="org.eclipse.jgit.test", - org.eclipse.jgit.internal;version="5.4.0";x-friends:="org.eclipse.jgit.test,org.eclipse.jgit.http.test", - org.eclipse.jgit.internal.fsck;version="5.4.0";x-friends:="org.eclipse.jgit.test", - org.eclipse.jgit.internal.ketch;version="5.4.0";x-friends:="org.eclipse.jgit.junit,org.eclipse.jgit.test,org.eclipse.jgit.pgm", - org.eclipse.jgit.internal.revwalk;version="5.4.0";x-internal:=true, - org.eclipse.jgit.internal.storage.dfs;version="5.4.0"; + org.eclipse.jgit.gitrepo.internal;version="5.4.1";x-internal:=true, + org.eclipse.jgit.hooks;version="5.4.1";uses:="org.eclipse.jgit.lib", + org.eclipse.jgit.ignore;version="5.4.1", + org.eclipse.jgit.ignore.internal;version="5.4.1";x-friends:="org.eclipse.jgit.test", + org.eclipse.jgit.internal;version="5.4.1";x-friends:="org.eclipse.jgit.test,org.eclipse.jgit.http.test", + org.eclipse.jgit.internal.fsck;version="5.4.1";x-friends:="org.eclipse.jgit.test", + org.eclipse.jgit.internal.ketch;version="5.4.1";x-friends:="org.eclipse.jgit.junit,org.eclipse.jgit.test,org.eclipse.jgit.pgm", + org.eclipse.jgit.internal.revwalk;version="5.4.1";x-internal:=true, + org.eclipse.jgit.internal.storage.dfs;version="5.4.1"; x-friends:="org.eclipse.jgit.test, org.eclipse.jgit.http.server, org.eclipse.jgit.http.test, org.eclipse.jgit.lfs.test", - org.eclipse.jgit.internal.storage.file;version="5.4.0"; + org.eclipse.jgit.internal.storage.file;version="5.4.1"; x-friends:="org.eclipse.jgit.test, org.eclipse.jgit.junit, org.eclipse.jgit.junit.http, @@ -77,19 +77,19 @@ Export-Package: org.eclipse.jgit.annotations;version="5.4.0", org.eclipse.jgit.pgm, org.eclipse.jgit.pgm.test, org.eclipse.jgit.ssh.apache", - org.eclipse.jgit.internal.storage.io;version="5.4.0";x-friends:="org.eclipse.jgit.junit,org.eclipse.jgit.test,org.eclipse.jgit.pgm", - org.eclipse.jgit.internal.storage.pack;version="5.4.0";x-friends:="org.eclipse.jgit.junit,org.eclipse.jgit.test,org.eclipse.jgit.pgm", - org.eclipse.jgit.internal.storage.reftable;version="5.4.0"; + org.eclipse.jgit.internal.storage.io;version="5.4.1";x-friends:="org.eclipse.jgit.junit,org.eclipse.jgit.test,org.eclipse.jgit.pgm", + org.eclipse.jgit.internal.storage.pack;version="5.4.1";x-friends:="org.eclipse.jgit.junit,org.eclipse.jgit.test,org.eclipse.jgit.pgm", + org.eclipse.jgit.internal.storage.reftable;version="5.4.1"; x-friends:="org.eclipse.jgit.http.test, org.eclipse.jgit.junit, org.eclipse.jgit.test, org.eclipse.jgit.pgm", - org.eclipse.jgit.internal.storage.reftree;version="5.4.0";x-friends:="org.eclipse.jgit.junit,org.eclipse.jgit.test,org.eclipse.jgit.pgm", - org.eclipse.jgit.internal.submodule;version="5.4.0";x-internal:=true, - org.eclipse.jgit.internal.transport.http;version="5.4.0";x-friends:="org.eclipse.jgit.test", - org.eclipse.jgit.internal.transport.parser;version="5.4.0";x-friends:="org.eclipse.jgit.http.server,org.eclipse.jgit.test", - org.eclipse.jgit.internal.transport.ssh;version="5.4.0";x-friends:="org.eclipse.jgit.ssh.apache", - org.eclipse.jgit.lib;version="5.4.0"; + org.eclipse.jgit.internal.storage.reftree;version="5.4.1";x-friends:="org.eclipse.jgit.junit,org.eclipse.jgit.test,org.eclipse.jgit.pgm", + org.eclipse.jgit.internal.submodule;version="5.4.1";x-internal:=true, + org.eclipse.jgit.internal.transport.http;version="5.4.1";x-friends:="org.eclipse.jgit.test", + org.eclipse.jgit.internal.transport.parser;version="5.4.1";x-friends:="org.eclipse.jgit.http.server,org.eclipse.jgit.test", + org.eclipse.jgit.internal.transport.ssh;version="5.4.1";x-friends:="org.eclipse.jgit.ssh.apache", + org.eclipse.jgit.lib;version="5.4.1"; uses:="org.eclipse.jgit.revwalk, org.eclipse.jgit.treewalk.filter, org.eclipse.jgit.util, @@ -99,33 +99,33 @@ Export-Package: org.eclipse.jgit.annotations;version="5.4.0", org.eclipse.jgit.treewalk, org.eclipse.jgit.transport, org.eclipse.jgit.submodule", - org.eclipse.jgit.lib.internal;version="5.4.0";x-internal:=true, - org.eclipse.jgit.merge;version="5.4.0"; + org.eclipse.jgit.lib.internal;version="5.4.1";x-internal:=true, + org.eclipse.jgit.merge;version="5.4.1"; uses:="org.eclipse.jgit.lib, org.eclipse.jgit.treewalk, org.eclipse.jgit.revwalk, org.eclipse.jgit.diff, org.eclipse.jgit.dircache, org.eclipse.jgit.api", - org.eclipse.jgit.nls;version="5.4.0", - org.eclipse.jgit.notes;version="5.4.0"; + org.eclipse.jgit.nls;version="5.4.1", + org.eclipse.jgit.notes;version="5.4.1"; uses:="org.eclipse.jgit.lib, org.eclipse.jgit.treewalk, org.eclipse.jgit.revwalk, org.eclipse.jgit.merge", - org.eclipse.jgit.patch;version="5.4.0";uses:="org.eclipse.jgit.lib,org.eclipse.jgit.diff", - org.eclipse.jgit.revplot;version="5.4.0";uses:="org.eclipse.jgit.lib,org.eclipse.jgit.revwalk", - org.eclipse.jgit.revwalk;version="5.4.0"; + org.eclipse.jgit.patch;version="5.4.1";uses:="org.eclipse.jgit.lib,org.eclipse.jgit.diff", + org.eclipse.jgit.revplot;version="5.4.1";uses:="org.eclipse.jgit.lib,org.eclipse.jgit.revwalk", + org.eclipse.jgit.revwalk;version="5.4.1"; uses:="org.eclipse.jgit.lib, org.eclipse.jgit.treewalk, org.eclipse.jgit.treewalk.filter, org.eclipse.jgit.diff, org.eclipse.jgit.revwalk.filter", - org.eclipse.jgit.revwalk.filter;version="5.4.0";uses:="org.eclipse.jgit.revwalk,org.eclipse.jgit.lib,org.eclipse.jgit.util", - org.eclipse.jgit.storage.file;version="5.4.0";uses:="org.eclipse.jgit.lib,org.eclipse.jgit.util", - org.eclipse.jgit.storage.pack;version="5.4.0";uses:="org.eclipse.jgit.lib", - org.eclipse.jgit.submodule;version="5.4.0";uses:="org.eclipse.jgit.lib,org.eclipse.jgit.treewalk.filter,org.eclipse.jgit.treewalk", - org.eclipse.jgit.transport;version="5.4.0"; + org.eclipse.jgit.revwalk.filter;version="5.4.1";uses:="org.eclipse.jgit.revwalk,org.eclipse.jgit.lib,org.eclipse.jgit.util", + org.eclipse.jgit.storage.file;version="5.4.1";uses:="org.eclipse.jgit.lib,org.eclipse.jgit.util", + org.eclipse.jgit.storage.pack;version="5.4.1";uses:="org.eclipse.jgit.lib", + org.eclipse.jgit.submodule;version="5.4.1";uses:="org.eclipse.jgit.lib,org.eclipse.jgit.treewalk.filter,org.eclipse.jgit.treewalk", + org.eclipse.jgit.transport;version="5.4.1"; uses:="org.eclipse.jgit.transport.resolver, org.eclipse.jgit.revwalk, org.eclipse.jgit.internal.storage.pack, @@ -138,24 +138,24 @@ Export-Package: org.eclipse.jgit.annotations;version="5.4.0", org.eclipse.jgit.transport.http, org.eclipse.jgit.errors, org.eclipse.jgit.storage.pack", - org.eclipse.jgit.transport.http;version="5.4.0";uses:="javax.net.ssl", - org.eclipse.jgit.transport.resolver;version="5.4.0";uses:="org.eclipse.jgit.lib,org.eclipse.jgit.transport", - org.eclipse.jgit.treewalk;version="5.4.0"; + org.eclipse.jgit.transport.http;version="5.4.1";uses:="javax.net.ssl", + org.eclipse.jgit.transport.resolver;version="5.4.1";uses:="org.eclipse.jgit.lib,org.eclipse.jgit.transport", + org.eclipse.jgit.treewalk;version="5.4.1"; uses:="org.eclipse.jgit.lib, org.eclipse.jgit.revwalk, org.eclipse.jgit.attributes, org.eclipse.jgit.treewalk.filter, org.eclipse.jgit.util, org.eclipse.jgit.dircache", - org.eclipse.jgit.treewalk.filter;version="5.4.0";uses:="org.eclipse.jgit.treewalk", - org.eclipse.jgit.util;version="5.4.0"; + org.eclipse.jgit.treewalk.filter;version="5.4.1";uses:="org.eclipse.jgit.treewalk", + org.eclipse.jgit.util;version="5.4.1"; uses:="org.eclipse.jgit.lib, org.eclipse.jgit.transport.http, org.eclipse.jgit.storage.file, org.ietf.jgss", - org.eclipse.jgit.util.io;version="5.4.0", - org.eclipse.jgit.util.sha1;version="5.4.0", - org.eclipse.jgit.util.time;version="5.4.0" + org.eclipse.jgit.util.io;version="5.4.1", + org.eclipse.jgit.util.sha1;version="5.4.1", + org.eclipse.jgit.util.time;version="5.4.1" Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Import-Package: com.googlecode.javaewah;version="[1.1.6,2.0.0)", com.jcraft.jsch;version="[0.1.37,0.2.0)", diff --git a/org.eclipse.jgit/META-INF/SOURCE-MANIFEST.MF b/org.eclipse.jgit/META-INF/SOURCE-MANIFEST.MF index ad348ee75..e21d20789 100644 --- a/org.eclipse.jgit/META-INF/SOURCE-MANIFEST.MF +++ b/org.eclipse.jgit/META-INF/SOURCE-MANIFEST.MF @@ -3,5 +3,5 @@ Bundle-ManifestVersion: 2 Bundle-Name: org.eclipse.jgit - Sources Bundle-SymbolicName: org.eclipse.jgit.source Bundle-Vendor: Eclipse.org - JGit -Bundle-Version: 5.4.0.qualifier -Eclipse-SourceBundle: org.eclipse.jgit;version="5.4.0.qualifier";roots="." +Bundle-Version: 5.4.1.qualifier +Eclipse-SourceBundle: org.eclipse.jgit;version="5.4.1.qualifier";roots="." diff --git a/org.eclipse.jgit/pom.xml b/org.eclipse.jgit/pom.xml index 3abdae832..ff9d03624 100644 --- a/org.eclipse.jgit/pom.xml +++ b/org.eclipse.jgit/pom.xml @@ -53,7 +53,7 @@ org.eclipse.jgit org.eclipse.jgit-parent - 5.4.0-SNAPSHOT + 5.4.1-SNAPSHOT org.eclipse.jgit diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/WildMatcher.java b/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/WildMatcher.java index 2ad87dade..239e2c81d 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/WildMatcher.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/WildMatcher.java @@ -64,7 +64,7 @@ public final class WildMatcher extends AbstractMatcher { public final boolean matches(String path, boolean assumeDirectory, boolean pathMatch) { return !dirOnly || assumeDirectory - || !pathMatch && isSubdirectory(path); + || (!pathMatch && isSubdirectory(path)); } /** {@inheritDoc} */ diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackParser.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackParser.java index 3a30d7daf..45e3b199f 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackParser.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackParser.java @@ -429,7 +429,7 @@ protected boolean onAppendBase(final int typeCode, final byte[] data, final byte[] buf = buffer(); int sz = data.length; int len = 0; - buf[len++] = (byte) ((typeCode << 4) | sz & 15); + buf[len++] = (byte) ((typeCode << 4) | (sz & 15)); sz >>>= 4; while (sz > 0) { buf[len - 1] |= 0x80; diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileSnapshot.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileSnapshot.java index f26eba336..1de313500 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileSnapshot.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileSnapshot.java @@ -48,9 +48,13 @@ import java.nio.file.attribute.BasicFileAttributes; import java.text.DateFormat; import java.text.SimpleDateFormat; +import java.time.Duration; import java.util.Date; import java.util.Locale; +import java.util.Objects; +import java.util.concurrent.TimeUnit; +import org.eclipse.jgit.annotations.NonNull; import org.eclipse.jgit.util.FS; /** @@ -77,6 +81,8 @@ public class FileSnapshot { */ public static final long UNKNOWN_SIZE = -1; + private static final Object MISSING_FILEKEY = new Object(); + /** * A FileSnapshot that is considered to always be modified. *

@@ -84,7 +90,8 @@ public class FileSnapshot { * file, but only after {@link #isModified(File)} gets invoked. The returned * snapshot contains only invalid status information. */ - public static final FileSnapshot DIRTY = new FileSnapshot(-1, -1, UNKNOWN_SIZE); + public static final FileSnapshot DIRTY = new FileSnapshot(-1, -1, + UNKNOWN_SIZE, Duration.ZERO, MISSING_FILEKEY); /** * A FileSnapshot that is clean if the file does not exist. @@ -93,7 +100,8 @@ public class FileSnapshot { * file to be clean. {@link #isModified(File)} will return false if the file * path does not exist. */ - public static final FileSnapshot MISSING_FILE = new FileSnapshot(0, 0, 0) { + public static final FileSnapshot MISSING_FILE = new FileSnapshot(0, 0, 0, + Duration.ZERO, MISSING_FILEKEY) { @Override public boolean isModified(File path) { return FS.DETECTED.exists(path); @@ -111,18 +119,12 @@ public boolean isModified(File path) { * @return the snapshot. */ public static FileSnapshot save(File path) { - long read = System.currentTimeMillis(); - long modified; - long size; - try { - BasicFileAttributes fileAttributes = FS.DETECTED.fileAttributes(path); - modified = fileAttributes.lastModifiedTime().toMillis(); - size = fileAttributes.size(); - } catch (IOException e) { - modified = path.lastModified(); - size = path.length(); - } - return new FileSnapshot(read, modified, size); + return new FileSnapshot(path); + } + + private static Object getFileKey(BasicFileAttributes fileAttributes) { + Object fileKey = fileAttributes.fileKey(); + return fileKey == null ? MISSING_FILEKEY : fileKey; } /** @@ -130,6 +132,11 @@ public static FileSnapshot save(File path) { * already known. *

* This method should be invoked before the file is accessed. + *

+ * Note that this method cannot rely on measuring file timestamp resolution + * to avoid racy git issues caused by finite file timestamp resolution since + * it's unknown in which filesystem the file is located. Hence the worst + * case fallback for timestamp resolution is used. * * @param modified * the last modification time of the file @@ -137,7 +144,8 @@ public static FileSnapshot save(File path) { */ public static FileSnapshot save(long modified) { final long read = System.currentTimeMillis(); - return new FileSnapshot(read, modified, -1); + return new FileSnapshot(read, modified, -1, Duration.ZERO, + MISSING_FILEKEY); } /** Last observed modification time of the path. */ @@ -154,11 +162,57 @@ public static FileSnapshot save(long modified) { * When set to {@link #UNKNOWN_SIZE} the size is not considered for modification checks. */ private final long size; - private FileSnapshot(long read, long modified, long size) { + /** measured filesystem timestamp resolution */ + private Duration fsTimestampResolution; + + /** + * Object that uniquely identifies the given file, or {@code + * null} if a file key is not available + */ + private final Object fileKey; + + /** + * Record a snapshot for a specific file path. + *

+ * This method should be invoked before the file is accessed. + * + * @param path + * the path to later remember. The path's current status + * information is saved. + */ + protected FileSnapshot(File path) { + this.lastRead = System.currentTimeMillis(); + this.fsTimestampResolution = FS + .getFsTimerResolution(path.toPath().getParent()); + BasicFileAttributes fileAttributes = null; + try { + fileAttributes = FS.DETECTED.fileAttributes(path); + } catch (IOException e) { + this.lastModified = path.lastModified(); + this.size = path.length(); + this.fileKey = MISSING_FILEKEY; + return; + } + this.lastModified = fileAttributes.lastModifiedTime().toMillis(); + this.size = fileAttributes.size(); + this.fileKey = getFileKey(fileAttributes); + } + + private boolean sizeChanged; + + private boolean fileKeyChanged; + + private boolean lastModifiedChanged; + + private boolean wasRacyClean; + + private FileSnapshot(long read, long modified, long size, + @NonNull Duration fsTimestampResolution, @NonNull Object fileKey) { this.lastRead = read; this.lastModified = modified; - this.cannotBeRacilyClean = notRacyClean(read); + this.fsTimestampResolution = fsTimestampResolution; this.size = size; + this.fileKey = fileKey; } /** @@ -187,15 +241,30 @@ public long size() { public boolean isModified(File path) { long currLastModified; long currSize; + Object currFileKey; try { BasicFileAttributes fileAttributes = FS.DETECTED.fileAttributes(path); currLastModified = fileAttributes.lastModifiedTime().toMillis(); currSize = fileAttributes.size(); + currFileKey = getFileKey(fileAttributes); } catch (IOException e) { currLastModified = path.lastModified(); currSize = path.length(); + currFileKey = MISSING_FILEKEY; } - return (currSize != UNKNOWN_SIZE && currSize != size) || isModified(currLastModified); + sizeChanged = isSizeChanged(currSize); + if (sizeChanged) { + return true; + } + fileKeyChanged = isFileKeyChanged(currFileKey); + if (fileKeyChanged) { + return true; + } + lastModifiedChanged = isModified(currLastModified); + if (lastModifiedChanged) { + return true; + } + return false; } /** @@ -222,11 +291,25 @@ public boolean isModified(File path) { */ public void setClean(FileSnapshot other) { final long now = other.lastRead; - if (notRacyClean(now)) + if (!isRacyClean(now)) { cannotBeRacilyClean = true; + } lastRead = now; } + /** + * Wait until this snapshot's file can't be racy anymore + * + * @throws InterruptedException + * if sleep was interrupted + */ + public void waitUntilNotRacy() throws InterruptedException { + while (isRacyClean(System.currentTimeMillis())) { + TimeUnit.NANOSECONDS + .sleep((fsTimestampResolution.toNanos() + 1) * 11 / 10); + } + } + /** * Compare two snapshots to see if they cache the same information. * @@ -235,72 +318,120 @@ public void setClean(FileSnapshot other) { * @return true if the two snapshots share the same information. */ public boolean equals(FileSnapshot other) { - return lastModified == other.lastModified; + return lastModified == other.lastModified && size == other.size + && Objects.equals(fileKey, other.fileKey); } /** {@inheritDoc} */ @Override - public boolean equals(Object other) { - if (other instanceof FileSnapshot) - return equals((FileSnapshot) other); - return false; + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (!(obj instanceof FileSnapshot)) { + return false; + } + FileSnapshot other = (FileSnapshot) obj; + return equals(other); } /** {@inheritDoc} */ @Override public int hashCode() { - // This is pretty pointless, but override hashCode to ensure that - // x.hashCode() == y.hashCode() when x.equals(y) is true. - // - return (int) lastModified; + return Objects.hash(Long.valueOf(lastModified), Long.valueOf(size), + fileKey); + } + + /** + * @return {@code true} if FileSnapshot.isModified(File) found the file size + * changed + */ + boolean wasSizeChanged() { + return sizeChanged; + } + + /** + * @return {@code true} if FileSnapshot.isModified(File) found the file key + * changed + */ + boolean wasFileKeyChanged() { + return fileKeyChanged; + } + + /** + * @return {@code true} if FileSnapshot.isModified(File) found the file's + * lastModified changed + */ + boolean wasLastModifiedChanged() { + return lastModifiedChanged; + } + + /** + * @return {@code true} if FileSnapshot.isModified(File) detected that + * lastModified is racily clean + */ + boolean wasLastModifiedRacilyClean() { + return wasRacyClean; } /** {@inheritDoc} */ + @SuppressWarnings("nls") @Override public String toString() { - if (this == DIRTY) - return "DIRTY"; //$NON-NLS-1$ - if (this == MISSING_FILE) - return "MISSING_FILE"; //$NON-NLS-1$ - DateFormat f = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS", //$NON-NLS-1$ + if (this == DIRTY) { + return "DIRTY"; + } + if (this == MISSING_FILE) { + return "MISSING_FILE"; + } + DateFormat f = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS", Locale.US); - return "FileSnapshot[modified: " + f.format(new Date(lastModified)) //$NON-NLS-1$ - + ", read: " + f.format(new Date(lastRead)) + "]"; //$NON-NLS-1$ //$NON-NLS-2$ + return "FileSnapshot[modified: " + f.format(new Date(lastModified)) + + ", read: " + f.format(new Date(lastRead)) + ", size:" + size + + ", fileKey: " + fileKey + "]"; } - private boolean notRacyClean(long read) { - // The last modified time granularity of FAT filesystems is 2 seconds. - // Using 2.5 seconds here provides a reasonably high assurance that - // a modification was not missed. - // - return read - lastModified > 2500; + private boolean isRacyClean(long read) { + // add a 10% safety margin + long racyNanos = (fsTimestampResolution.toNanos() + 1) * 11 / 10; + return wasRacyClean = (read - lastModified) * 1_000_000 <= racyNanos; } private boolean isModified(long currLastModified) { // Any difference indicates the path was modified. - // - if (lastModified != currLastModified) + + lastModifiedChanged = lastModified != currLastModified; + if (lastModifiedChanged) { return true; + } // We have already determined the last read was far enough // after the last modification that any new modifications // are certain to change the last modified time. - // - if (cannotBeRacilyClean) + if (cannotBeRacilyClean) { return false; - - if (notRacyClean(lastRead)) { + } + if (!isRacyClean(lastRead)) { // Our last read should have marked cannotBeRacilyClean, // but this thread may not have seen the change. The read // of the volatile field lastRead should have fixed that. - // return false; } // We last read this path too close to its last observed // modification time. We may have missed a modification. // Scan again, to ensure we still see the same state. - // return true; } + + private boolean isFileKeyChanged(Object currFileKey) { + return currFileKey != MISSING_FILEKEY && !currFileKey.equals(fileKey); + } + + private boolean isSizeChanged(long currSize) { + return currSize != UNKNOWN_SIZE && currSize != size; + } } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GC.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GC.java index 70a3d5ea5..4540860a0 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GC.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GC.java @@ -177,7 +177,7 @@ public static void setExecutor(ExecutorService e) { private Date packExpire; - private PackConfig pconfig = null; + private PackConfig pconfig; /** * the refs which existed during the last call to {@link #repack()}. This is @@ -213,6 +213,7 @@ public static void setExecutor(ExecutorService e) { */ public GC(FileRepository repo) { this.repo = repo; + this.pconfig = new PackConfig(repo); this.pm = NullProgressMonitor.INSTANCE; } @@ -397,7 +398,7 @@ private void deleteOldPacks(Collection oldPacks, */ private void removeOldPack(File packFile, String packName, PackExt ext, int deleteOptions) throws IOException { - if (pconfig != null && pconfig.isPreserveOldPacks()) { + if (pconfig.isPreserveOldPacks()) { File oldPackDir = repo.getObjectDatabase().getPreservedDirectory(); FileUtils.mkdir(oldPackDir, true); @@ -413,7 +414,7 @@ private void removeOldPack(File packFile, String packName, PackExt ext, * Delete the preserved directory including all pack files within */ private void prunePreserved() { - if (pconfig != null && pconfig.isPrunePreserved()) { + if (pconfig.isPrunePreserved()) { try { FileUtils.delete(repo.getObjectDatabase().getPreservedDirectory(), FileUtils.RECURSIVE | FileUtils.RETRY | FileUtils.SKIP_MISSING); @@ -855,7 +856,7 @@ public Collection repack() throws IOException { nonHeads.addAll(indexObjects); // Combine the GC_REST objects into the GC pack if requested - if (pconfig != null && pconfig.getSinglePack()) { + if (pconfig.getSinglePack()) { allHeadsAndTags.addAll(nonHeads); nonHeads.clear(); } @@ -1159,7 +1160,7 @@ private PackFile writePack(@NonNull Set want, return Integer.signum(o1.hashCode() - o2.hashCode()); }); try (PackWriter pw = new PackWriter( - (pconfig == null) ? new PackConfig(repo) : pconfig, + pconfig, repo.newObjectReader())) { // prepare the PackWriter pw.setDeltaBaseAsOffset(true); @@ -1255,8 +1256,23 @@ private PackFile writePack(@NonNull Set want, realExt), e); } } - - return repo.getObjectDatabase().openPack(realPack); + boolean interrupted = false; + try { + FileSnapshot snapshot = FileSnapshot.save(realPack); + if (pconfig.doWaitPreventRacyPack(snapshot.size())) { + snapshot.waitUntilNotRacy(); + } + } catch (InterruptedException e) { + interrupted = true; + } + try { + return repo.getObjectDatabase().openPack(realPack); + } finally { + if (interrupted) { + // Re-set interrupted flag + Thread.currentThread().interrupt(); + } + } } finally { if (tmpPack != null && tmpPack.exists()) tmpPack.delete(); @@ -1434,7 +1450,7 @@ public void setPackExpireAgeMillis(long packExpireAgeMillis) { * the {@link org.eclipse.jgit.storage.pack.PackConfig} used when * writing packs */ - public void setPackConfig(PackConfig pconfig) { + public void setPackConfig(@NonNull PackConfig pconfig) { this.pconfig = pconfig; } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ObjectDirectory.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ObjectDirectory.java index d502fea02..258cceebe 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ObjectDirectory.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ObjectDirectory.java @@ -910,9 +910,10 @@ private PackList scanPacksImpl(PackList old) { final String packName = base + PACK.getExtension(); final File packFile = new File(packDirectory, packName); - final PackFile oldPack = forReuse.remove(packName); + final PackFile oldPack = forReuse.get(packName); if (oldPack != null && !oldPack.getFileSnapshot().isModified(packFile)) { + forReuse.remove(packName); list.add(oldPack); continue; } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ObjectDirectoryPackParser.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ObjectDirectoryPackParser.java index 0cec2d5a8..ade7a8e96 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ObjectDirectoryPackParser.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ObjectDirectoryPackParser.java @@ -65,6 +65,7 @@ import org.eclipse.jgit.lib.CoreConfig; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.ProgressMonitor; +import org.eclipse.jgit.storage.pack.PackConfig; import org.eclipse.jgit.transport.PackParser; import org.eclipse.jgit.transport.PackedObjectInfo; import org.eclipse.jgit.util.FileUtils; @@ -122,9 +123,12 @@ public class ObjectDirectoryPackParser extends PackParser { /** The pack that was created, if parsing was successful. */ private PackFile newPack; + private PackConfig pconfig; + ObjectDirectoryPackParser(FileObjectDatabase odb, InputStream src) { super(odb, src); this.db = odb; + this.pconfig = new PackConfig(odb.getConfig()); this.crc = new CRC32(); this.tailDigest = Constants.newMessageDigest(); @@ -349,7 +353,7 @@ protected boolean onAppendBase(final int typeCode, final byte[] data, final byte[] buf = buffer(); int sz = data.length; int len = 0; - buf[len++] = (byte) ((typeCode << 4) | sz & 15); + buf[len++] = (byte) ((typeCode << 4) | (sz & 15)); sz >>>= 4; while (sz > 0) { buf[len - 1] |= 0x80; @@ -514,6 +518,15 @@ private PackLock renameAndOpenPack(String lockMessage) JGitText.get().cannotMoveIndexTo, finalIdx), e); } + boolean interrupted = false; + try { + FileSnapshot snapshot = FileSnapshot.save(finalPack); + if (pconfig.doWaitPreventRacyPack(snapshot.size())) { + snapshot.waitUntilNotRacy(); + } + } catch (InterruptedException e) { + interrupted = true; + } try { newPack = db.openPack(finalPack); } catch (IOException err) { @@ -523,6 +536,11 @@ private PackLock renameAndOpenPack(String lockMessage) if (finalIdx.exists()) FileUtils.delete(finalIdx); throw err; + } finally { + if (interrupted) { + // Re-set interrupted flag + Thread.currentThread().interrupt(); + } } return lockMessage != null ? keep : null; diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackFile.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackFile.java index c1aac2372..a89e2ec03 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackFile.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackFile.java @@ -93,6 +93,8 @@ import org.eclipse.jgit.util.LongList; import org.eclipse.jgit.util.NB; import org.eclipse.jgit.util.RawParseUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * A Git version 2 pack file representation. A pack file contains Git objects in @@ -100,6 +102,7 @@ * objects are similar. */ public class PackFile implements Iterable { + private final static Logger LOG = LoggerFactory.getLogger(PackFile.class); /** Sorts PackFiles to be most recently created to least recently created. */ public static final Comparator SORT = (PackFile a, PackFile b) -> b.packLastModified - a.packLastModified; @@ -127,7 +130,7 @@ public class PackFile implements Iterable { int packLastModified; - private FileSnapshot fileSnapshot; + private PackFileSnapshot fileSnapshot; private volatile boolean invalid; @@ -164,7 +167,7 @@ public class PackFile implements Iterable { */ public PackFile(File packFile, int extensions) { this.packFile = packFile; - this.fileSnapshot = FileSnapshot.save(packFile); + this.fileSnapshot = PackFileSnapshot.save(packFile); this.packLastModified = (int) (fileSnapshot.lastModified() >> 10); this.extensions = extensions; @@ -185,10 +188,22 @@ private PackIndex idx() throws IOException { throw new PackInvalidException(packFile, invalidatingCause); } try { + long start = System.currentTimeMillis(); idx = PackIndex.open(extFile(INDEX)); + if (LOG.isDebugEnabled()) { + LOG.debug(String.format( + "Opening pack index %s, size %.3f MB took %d ms", //$NON-NLS-1$ + extFile(INDEX).getAbsolutePath(), + Float.valueOf(extFile(INDEX).length() + / (1024f * 1024)), + Long.valueOf(System.currentTimeMillis() + - start))); + } if (packChecksum == null) { packChecksum = idx.packChecksum; + fileSnapshot.setChecksum( + ObjectId.fromRaw(packChecksum)); } else if (!Arrays.equals(packChecksum, idx.packChecksum)) { throw new PackMismatchException(MessageFormat @@ -367,10 +382,14 @@ ObjectId findObjectForOffset(long offset) throws IOException { * * @return the packfile @{@link FileSnapshot} that the object is loaded from. */ - FileSnapshot getFileSnapshot() { + PackFileSnapshot getFileSnapshot() { return fileSnapshot; } + AnyObjectId getPackChecksum() { + return ObjectId.fromRaw(packChecksum); + } + private final byte[] decompress(final long position, final int sz, final WindowCursor curs) throws IOException, DataFormatException { byte[] dstbuf; @@ -1205,4 +1224,12 @@ private File extFile(PackExt ext) { private boolean hasExt(PackExt ext) { return (extensions & ext.getBit()) != 0; } + + @SuppressWarnings("nls") + @Override + public String toString() { + return "PackFile [packFileName=" + packFile.getName() + ", length=" + + packFile.length() + ", packChecksum=" + + ObjectId.fromRaw(packChecksum).name() + "]"; + } } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackFileSnapshot.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackFileSnapshot.java new file mode 100644 index 000000000..19ec3af49 --- /dev/null +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackFileSnapshot.java @@ -0,0 +1,123 @@ +/* + * Copyright (C) 2019, Matthias Sohn + * and other copyright owners as documented in the project's IP log. + * + * This program and the accompanying materials are made available + * under the terms of the Eclipse Distribution License v1.0 which + * accompanies this distribution, is reproduced below, and is + * available at http://www.eclipse.org/org/documents/edl-v10.php + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or + * without modification, are permitted provided that the following + * conditions are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * + * - Neither the name of the Eclipse Foundation, Inc. nor the + * names of its contributors may be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.eclipse.jgit.internal.storage.file; + +import java.io.File; +import java.io.IOException; +import java.io.RandomAccessFile; + +import org.eclipse.jgit.lib.AnyObjectId; +import org.eclipse.jgit.lib.ObjectId; + +class PackFileSnapshot extends FileSnapshot { + + private static final ObjectId MISSING_CHECKSUM = ObjectId.zeroId(); + + /** + * Record a snapshot for a specific packfile path. + *

+ * This method should be invoked before the packfile is accessed. + * + * @param path + * the path to later remember. The path's current status + * information is saved. + * @return the snapshot. + */ + public static PackFileSnapshot save(File path) { + return new PackFileSnapshot(path); + } + + private AnyObjectId checksum = MISSING_CHECKSUM; + + private boolean wasChecksumChanged; + + + PackFileSnapshot(File packFile) { + super(packFile); + } + + void setChecksum(AnyObjectId checksum) { + this.checksum = checksum; + } + + /** {@inheritDoc} */ + @Override + public boolean isModified(File packFile) { + if (!super.isModified(packFile)) { + return false; + } + if (wasSizeChanged() || wasFileKeyChanged() + || !wasLastModifiedRacilyClean()) { + return true; + } + return isChecksumChanged(packFile); + } + + boolean isChecksumChanged(File packFile) { + return wasChecksumChanged = checksum != MISSING_CHECKSUM + && !checksum.equals(readChecksum(packFile)); + } + + private AnyObjectId readChecksum(File packFile) { + try (RandomAccessFile fd = new RandomAccessFile(packFile, "r")) { //$NON-NLS-1$ + fd.seek(fd.length() - 20); + final byte[] buf = new byte[20]; + fd.readFully(buf, 0, 20); + return ObjectId.fromRaw(buf); + } catch (IOException e) { + return MISSING_CHECKSUM; + } + } + + boolean wasChecksumChanged() { + return wasChecksumChanged; + } + + @SuppressWarnings("nls") + @Override + public String toString() { + return "PackFileSnapshot [checksum=" + checksum + ", " + + super.toString() + "]"; + } + +} diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackInserter.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackInserter.java index 0ce3cc93c..a27a2b00c 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackInserter.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackInserter.java @@ -86,6 +86,7 @@ import org.eclipse.jgit.lib.ObjectLoader; import org.eclipse.jgit.lib.ObjectReader; import org.eclipse.jgit.lib.ObjectStream; +import org.eclipse.jgit.storage.pack.PackConfig; import org.eclipse.jgit.transport.PackParser; import org.eclipse.jgit.transport.PackedObjectInfo; import org.eclipse.jgit.util.BlockList; @@ -115,8 +116,11 @@ public class PackInserter extends ObjectInserter { private PackStream packOut; private Inflater cachedInflater; + private PackConfig pconfig; + PackInserter(ObjectDirectory db) { this.db = db; + this.pconfig = new PackConfig(db.getConfig()); } /** @@ -296,9 +300,25 @@ public void flush() throws IOException { realIdx), e); } - db.openPack(realPack); - rollback = false; - clear(); + boolean interrupted = false; + try { + FileSnapshot snapshot = FileSnapshot.save(realPack); + if (pconfig.doWaitPreventRacyPack(snapshot.size())) { + snapshot.waitUntilNotRacy(); + } + } catch (InterruptedException e) { + interrupted = true; + } + try { + db.openPack(realPack); + rollback = false; + } finally { + clear(); + if (interrupted) { + // Re-set interrupted flag + Thread.currentThread().interrupt(); + } + } } private static void writePackIndex(File idx, byte[] packHash, diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/UnpackedObject.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/UnpackedObject.java index cf474afbb..79f130757 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/UnpackedObject.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/UnpackedObject.java @@ -295,7 +295,7 @@ static boolean isStandardFormat(byte[] hdr) { * can always correctly determine the buffer format. */ final int fb = hdr[0] & 0xff; - return (fb & 0x8f) == 0x08 && (((fb << 8) | hdr[1] & 0xff) % 31) == 0; + return (fb & 0x8f) == 0x08 && (((fb << 8) | (hdr[1] & 0xff)) % 31) == 0; } static InputStream inflate(final InputStream in, final long size, diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackWriter.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackWriter.java index 2f7e1a656..714e8308f 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackWriter.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackWriter.java @@ -878,7 +878,7 @@ private ObjectWalk getObjectWalk() { * already been visited at this depth or shallower, it is not necessary to * re-visit at this depth. */ - private class DepthAwareVisitationPolicy + private static class DepthAwareVisitationPolicy implements ObjectWalk.VisitationPolicy { private final Map lowestDepthVisited = new HashMap<>(); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/PackConfig.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/PackConfig.java index ed3fe2aab..6722e9bdc 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/PackConfig.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/PackConfig.java @@ -116,12 +116,30 @@ public class PackConfig { */ public static final int DEFAULT_DELTA_SEARCH_WINDOW_SIZE = 10; + private static final int MB = 1 << 20; + /** * Default big file threshold: {@value} * * @see #setBigFileThreshold(int) */ - public static final int DEFAULT_BIG_FILE_THRESHOLD = 50 * 1024 * 1024; + public static final int DEFAULT_BIG_FILE_THRESHOLD = 50 * MB; + + /** + * Default if we wait before opening a newly written pack to prevent its + * lastModified timestamp could be racy + * + * @since 5.1.8 + */ + public static final boolean DEFAULT_WAIT_PREVENT_RACY_PACK = false; + + /** + * Default if we wait before opening a newly written pack to prevent its + * lastModified timestamp could be racy + * + * @since 5.1.8 + */ + public static final long DEFAULT_MINSIZE_PREVENT_RACY_PACK = 100 * MB; /** * Default delta cache size: {@value} @@ -238,6 +256,10 @@ public class PackConfig { private int bigFileThreshold = DEFAULT_BIG_FILE_THRESHOLD; + private boolean waitPreventRacyPack = DEFAULT_WAIT_PREVENT_RACY_PACK; + + private long minSizePreventRacyPack = DEFAULT_MINSIZE_PREVENT_RACY_PACK; + private int threads; private Executor executor; @@ -314,6 +336,8 @@ public PackConfig(PackConfig cfg) { this.deltaCacheSize = cfg.deltaCacheSize; this.deltaCacheLimit = cfg.deltaCacheLimit; this.bigFileThreshold = cfg.bigFileThreshold; + this.waitPreventRacyPack = cfg.waitPreventRacyPack; + this.minSizePreventRacyPack = cfg.minSizePreventRacyPack; this.threads = cfg.threads; this.executor = cfg.executor; this.indexVersion = cfg.indexVersion; @@ -736,6 +760,76 @@ public void setBigFileThreshold(int bigFileThreshold) { this.bigFileThreshold = bigFileThreshold; } + /** + * Get whether we wait before opening a newly written pack to prevent its + * lastModified timestamp could be racy + * + * @return whether we wait before opening a newly written pack to prevent + * its lastModified timestamp could be racy + * @since 5.1.8 + */ + public boolean isWaitPreventRacyPack() { + return waitPreventRacyPack; + } + + /** + * Get whether we wait before opening a newly written pack to prevent its + * lastModified timestamp could be racy. Returns {@code true} if + * {@code waitToPreventRacyPack = true} and + * {@code packSize > minSizePreventRacyPack}, {@code false} otherwise. + * + * @param packSize + * size of the pack file + * + * @return whether we wait before opening a newly written pack to prevent + * its lastModified timestamp could be racy + * @since 5.1.8 + */ + public boolean doWaitPreventRacyPack(long packSize) { + return isWaitPreventRacyPack() + && packSize > getMinSizePreventRacyPack(); + } + + /** + * Set whether we wait before opening a newly written pack to prevent its + * lastModified timestamp could be racy + * + * @param waitPreventRacyPack + * whether we wait before opening a newly written pack to prevent + * its lastModified timestamp could be racy + * @since 5.1.8 + */ + public void setWaitPreventRacyPack(boolean waitPreventRacyPack) { + this.waitPreventRacyPack = waitPreventRacyPack; + } + + /** + * Get minimum packfile size for which we wait before opening a newly + * written pack to prevent its lastModified timestamp could be racy if + * {@code isWaitToPreventRacyPack} is {@code true}. + * + * @return minimum packfile size, default is 100 MiB + * + * @since 5.1.8 + */ + public long getMinSizePreventRacyPack() { + return minSizePreventRacyPack; + } + + /** + * Set minimum packfile size for which we wait before opening a newly + * written pack to prevent its lastModified timestamp could be racy if + * {@code isWaitToPreventRacyPack} is {@code true}. + * + * @param minSizePreventRacyPack + * minimum packfile size, default is 100 MiB + * + * @since 5.1.8 + */ + public void setMinSizePreventRacyPack(long minSizePreventRacyPack) { + this.minSizePreventRacyPack = minSizePreventRacyPack; + } + /** * Get the compression level applied to objects in the pack. * @@ -1083,6 +1177,10 @@ public void fromConfig(Config rc) { setBitmapInactiveBranchAgeInDays( rc.getInt("pack", "bitmapinactivebranchageindays", //$NON-NLS-1$ //$NON-NLS-2$ getBitmapInactiveBranchAgeInDays())); + setWaitPreventRacyPack(rc.getBoolean("pack", "waitpreventracypack", //$NON-NLS-1$ //$NON-NLS-2$ + isWaitPreventRacyPack())); + setMinSizePreventRacyPack(rc.getLong("pack", "minsizepreventracypack", //$NON-NLS-1$//$NON-NLS-2$ + getMinSizePreventRacyPack())); } /** {@inheritDoc} */ diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackFetchConnection.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackFetchConnection.java index 4dd9cc577..a61c243bd 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackFetchConnection.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackFetchConnection.java @@ -677,7 +677,7 @@ private void negotiate(ProgressMonitor monitor) throws IOException, state.writeTo(out, null); } - if (receivedContinue && havesSinceLastContinue > MAX_HAVES + if ((receivedContinue && havesSinceLastContinue > MAX_HAVES) || havesSent >= maxHaves) { // Our history must be really different from the remote's. // We just sent a whole slew of have lines, and it did not diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/HttpConfig.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/HttpConfig.java index 54c21cbc8..36ff2836a 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/HttpConfig.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/HttpConfig.java @@ -397,8 +397,9 @@ private String findMatch(Set names, URIish uri) { // A longer path match is always preferred even over a user // match. If the path matches are equal, a match with user wins // over a match without user. - if (matchLength > bestMatchLength || !withUser && hasUser - && matchLength >= 0 && matchLength == bestMatchLength) { + if (matchLength > bestMatchLength + || (!withUser && hasUser && matchLength >= 0 + && matchLength == bestMatchLength)) { bestMatch = s; bestMatchLength = matchLength; withUser = hasUser; @@ -444,7 +445,7 @@ static int segmentCompare(String uriPath, String m) { int uLength = uriPath.length(); int mLength = matchPath.length(); if (mLength == uLength || matchPath.charAt(mLength - 1) == '/' - || mLength < uLength && uriPath.charAt(mLength) == '/') { + || (mLength < uLength && uriPath.charAt(mLength) == '/')) { return mLength; } return -1; @@ -464,7 +465,7 @@ static String normalize(String path) { if (slash < 0) { slash = length; } - if (slash == i || slash == i + 1 && path.charAt(i) == '.') { + if (slash == i || (slash == i + 1 && path.charAt(i) == '.')) { // Skip /. or also double slashes } else if (slash == i + 2 && path.charAt(i) == '.' && path.charAt(i + 1) == '.') { diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/URIish.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/URIish.java index 70fb1f0e5..34730d395 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/URIish.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/URIish.java @@ -362,8 +362,8 @@ private String cleanLeadingSlashes(String p, String s) { if (p.length() >= 3 && p.charAt(0) == '/' && p.charAt(2) == ':' - && (p.charAt(1) >= 'A' && p.charAt(1) <= 'Z' || p.charAt(1) >= 'a' - && p.charAt(1) <= 'z')) + && ((p.charAt(1) >= 'A' && p.charAt(1) <= 'Z') + || (p.charAt(1) >= 'a' && p.charAt(1) <= 'z'))) return p.substring(1); else if (s != null && p.length() >= 2 && p.charAt(0) == '/' && p.charAt(1) == '~') diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/FS.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/FS.java index 53685029d..bde750b5d 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/util/FS.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/FS.java @@ -55,23 +55,31 @@ import java.io.OutputStream; import java.io.PrintStream; import java.nio.charset.Charset; +import java.nio.file.AccessDeniedException; +import java.nio.file.FileStore; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.attribute.BasicFileAttributes; +import java.nio.file.attribute.FileTime; import java.security.AccessController; import java.security.PrivilegedAction; import java.text.MessageFormat; +import java.time.Duration; import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.Objects; import java.util.Optional; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; +import java.util.stream.Collectors; +import org.eclipse.jgit.annotations.NonNull; import org.eclipse.jgit.annotations.Nullable; import org.eclipse.jgit.api.errors.JGitInternalException; import org.eclipse.jgit.errors.CommandFailedException; @@ -180,6 +188,83 @@ public int getRc() { } } + private static final class FileStoreAttributeCache { + /** + * The last modified time granularity of FAT filesystems is 2 seconds. + */ + private static final Duration FALLBACK_TIMESTAMP_RESOLUTION = Duration + .ofMillis(2000); + + private static final Map attributeCache = new ConcurrentHashMap<>(); + + static Duration getFsTimestampResolution(Path file) { + try { + Path dir = Files.isDirectory(file) ? file : file.getParent(); + if (!dir.toFile().canWrite()) { + // can not determine FileStore of an unborn directory or in + // a read-only directory + return FALLBACK_TIMESTAMP_RESOLUTION; + } + FileStore s = Files.getFileStore(dir); + FileStoreAttributeCache c = attributeCache.get(s); + if (c == null) { + c = new FileStoreAttributeCache(dir); + attributeCache.put(s, c); + if (LOG.isDebugEnabled()) { + LOG.debug(c.toString()); + } + } + return c.getFsTimestampResolution(); + + } catch (IOException | InterruptedException e) { + LOG.warn(e.getMessage(), e); + return FALLBACK_TIMESTAMP_RESOLUTION; + } + } + + private Duration fsTimestampResolution; + + Duration getFsTimestampResolution() { + return fsTimestampResolution; + } + + private FileStoreAttributeCache(Path dir) + throws IOException, InterruptedException { + Path probe = dir.resolve(".probe-" + UUID.randomUUID()); //$NON-NLS-1$ + Files.createFile(probe); + try { + FileTime startTime = Files.getLastModifiedTime(probe); + FileTime actTime = startTime; + long sleepTime = 512; + while (actTime.compareTo(startTime) <= 0) { + TimeUnit.NANOSECONDS.sleep(sleepTime); + FileUtils.touch(probe); + actTime = Files.getLastModifiedTime(probe); + // limit sleep time to max. 100ms + if (sleepTime < 100_000_000L) { + sleepTime = sleepTime * 2; + } + } + fsTimestampResolution = Duration.between(startTime.toInstant(), + actTime.toInstant()); + } catch (AccessDeniedException e) { + LOG.error(e.getLocalizedMessage(), e); + } finally { + Files.delete(probe); + } + } + + @SuppressWarnings("nls") + @Override + public String toString() { + return "FileStoreAttributeCache[" + attributeCache.keySet() + .stream() + .map(key -> "FileStore[" + key + "]: fsTimestampResolution=" + + attributeCache.get(key).getFsTimestampResolution()) + .collect(Collectors.joining(",\n")) + "]"; + } + } + /** The auto-detected implementation selected for this operating system and JRE. */ public static final FS DETECTED = detect(); @@ -221,6 +306,21 @@ public static FS detect(Boolean cygwinUsed) { return factory.detect(cygwinUsed); } + /** + * Get an estimate for the filesystem timestamp resolution from a cache of + * timestamp resolution per FileStore, if not yet available it is measured + * for a probe file under the given directory. + * + * @param dir + * the directory under which the probe file will be created to + * measure the timer resolution. + * @return measured filesystem timestamp resolution + * @since 5.2.3 + */ + public static Duration getFsTimerResolution(@NonNull Path dir) { + return FileStoreAttributeCache.getFsTimestampResolution(dir); + } + private volatile Holder userHome; private volatile Holder gitSystemConfig; diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/FileUtils.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/FileUtils.java index 530bd9fb1..0e8732d6f 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/util/FileUtils.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/FileUtils.java @@ -50,6 +50,7 @@ import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; +import java.io.OutputStream; import java.nio.file.AtomicMoveNotSupportedException; import java.nio.file.CopyOption; import java.nio.file.Files; @@ -928,4 +929,18 @@ public static String pathToString(File file) { } return path; } + + /** + * Touch the given file + * + * @param f + * the file to touch + * @throws IOException + * @since 5.2.3 + */ + public static void touch(Path f) throws IOException { + try (OutputStream fos = Files.newOutputStream(f)) { + // touch the file + } + } } diff --git a/pom.xml b/pom.xml index 48d31c4db..e1ff36e7b 100644 --- a/pom.xml +++ b/pom.xml @@ -51,7 +51,7 @@ org.eclipse.jgit org.eclipse.jgit-parent pom - 5.4.0-SNAPSHOT + 5.4.1-SNAPSHOT JGit - Parent ${jgit-url} diff --git a/tools/BUILD b/tools/BUILD index abf6c9dc0..d94ce02ad 100644 --- a/tools/BUILD +++ b/tools/BUILD @@ -14,8 +14,10 @@ default_java_toolchain( visibility = ["//visibility:public"], ) -# This EP warnings list borrowed from here: +# Error Prone errors enabled by default; see ../.bazelrc for how this is +# enabled. This warnings list is originally based on: # https://github.com/bazelbuild/BUILD_file_generator/blob/master/tools/bazel_defs/java.bzl +# However, feel free to add any additional errors. Thus far they have all been pretty useful. java_package_configuration( name = "error_prone", javacopts = [ @@ -23,61 +25,61 @@ java_package_configuration( "-Xep:MissingCasesInEnumSwitch:ERROR", "-Xep:ReferenceEquality:WARN", "-Xep:StringEquality:WARN", - "-Xep:WildcardImport:WARN", + "-Xep:WildcardImport:ERROR", "-Xep:AmbiguousMethodReference:WARN", - "-Xep:BadAnnotationImplementation:WARN", + "-Xep:BadAnnotationImplementation:ERROR", "-Xep:BadComparable:WARN", "-Xep:BoxedPrimitiveConstructor:ERROR", - "-Xep:CannotMockFinalClass:WARN", + "-Xep:CannotMockFinalClass:ERROR", "-Xep:ClassCanBeStatic:ERROR", "-Xep:ClassNewInstance:WARN", "-Xep:DefaultCharset:ERROR", - "-Xep:DoubleCheckedLocking:WARN", - "-Xep:ElementsCountedInLoop:WARN", - "-Xep:EqualsHashCode:WARN", - "-Xep:EqualsIncompatibleType:WARN", + "-Xep:DoubleCheckedLocking:ERROR", + "-Xep:ElementsCountedInLoop:ERROR", + "-Xep:EqualsHashCode:ERROR", + "-Xep:EqualsIncompatibleType:ERROR", "-Xep:ExpectedExceptionChecker:ERROR", "-Xep:Finally:WARN", - "-Xep:FloatingPointLiteralPrecision:WARN", - "-Xep:FragmentInjection:WARN", - "-Xep:FragmentNotInstantiable:WARN", - "-Xep:FunctionalInterfaceClash:WARN", + "-Xep:FloatingPointLiteralPrecision:ERROR", + "-Xep:FragmentInjection:ERROR", + "-Xep:FragmentNotInstantiable:ERROR", + "-Xep:FunctionalInterfaceClash:ERROR", "-Xep:FutureReturnValueIgnored:ERROR", - "-Xep:GetClassOnEnum:WARN", - "-Xep:ImmutableAnnotationChecker:WARN", + "-Xep:GetClassOnEnum:ERROR", + "-Xep:ImmutableAnnotationChecker:ERROR", "-Xep:ImmutableEnumChecker:WARN", - "-Xep:IncompatibleModifiers:WARN", - "-Xep:InjectOnConstructorOfAbstractClass:WARN", - "-Xep:InputStreamSlowMultibyteRead:WARN", - "-Xep:IterableAndIterator:WARN", - "-Xep:JUnit3FloatingPointComparisonWithoutDelta:WARN", - "-Xep:JUnitAmbiguousTestClass:WARN", - "-Xep:LiteralClassName:WARN", + "-Xep:IncompatibleModifiers:ERROR", + "-Xep:InjectOnConstructorOfAbstractClass:ERROR", + "-Xep:InputStreamSlowMultibyteRead:ERROR", + "-Xep:IterableAndIterator:ERROR", + "-Xep:JUnit3FloatingPointComparisonWithoutDelta:ERROR", + "-Xep:JUnitAmbiguousTestClass:ERROR", + "-Xep:LiteralClassName:ERROR", "-Xep:MissingFail:ERROR", - "-Xep:MissingOverride:WARN", - "-Xep:MutableConstantField:WARN", + "-Xep:MissingOverride:ERROR", + "-Xep:MutableConstantField:ERROR", "-Xep:NarrowingCompoundAssignment:WARN", - "-Xep:NonAtomicVolatileUpdate:WARN", + "-Xep:NonAtomicVolatileUpdate:ERROR", "-Xep:NonOverridingEquals:WARN", - "-Xep:NullableConstructor:WARN", - "-Xep:NullablePrimitive:WARN", - "-Xep:NullableVoid:WARN", - "-Xep:OperatorPrecedence:WARN", - "-Xep:OverridesGuiceInjectableMethod:WARN", - "-Xep:PreconditionsInvalidPlaceholder:WARN", - "-Xep:ProtoFieldPreconditionsCheckNotNull:WARN", - "-Xep:ProtocolBufferOrdinal:WARN", - "-Xep:RequiredModifiers:WARN", + "-Xep:NullableConstructor:ERROR", + "-Xep:NullablePrimitive:ERROR", + "-Xep:NullableVoid:ERROR", + "-Xep:OperatorPrecedence:ERROR", + "-Xep:OverridesGuiceInjectableMethod:ERROR", + "-Xep:PreconditionsInvalidPlaceholder:ERROR", + "-Xep:ProtoFieldPreconditionsCheckNotNull:ERROR", + "-Xep:ProtocolBufferOrdinal:ERROR", + "-Xep:RequiredModifiers:ERROR", "-Xep:ShortCircuitBoolean:WARN", - "-Xep:SimpleDateFormatConstant:WARN", - "-Xep:StaticGuardedByInstance:WARN", - "-Xep:SynchronizeOnNonFinalField:WARN", - "-Xep:TruthConstantAsserts:WARN", - "-Xep:TypeParameterShadowing:WARN", + "-Xep:SimpleDateFormatConstant:ERROR", + "-Xep:StaticGuardedByInstance:ERROR", + "-Xep:SynchronizeOnNonFinalField:ERROR", + "-Xep:TruthConstantAsserts:ERROR", + "-Xep:TypeParameterShadowing:ERROR", "-Xep:TypeParameterUnusedInFormals:WARN", - "-Xep:URLEqualsHashCode:WARN", - "-Xep:UnsynchronizedOverridesSynchronized:WARN", - "-Xep:WaitNotInLoop:WARN", + "-Xep:URLEqualsHashCode:ERROR", + "-Xep:UnsynchronizedOverridesSynchronized:ERROR", + "-Xep:WaitNotInLoop:ERROR", ], packages = ["error_prone_packages"], )