Merge branch 'stable-6.0'

* stable-6.0:
  Add missing @since tags
  Add missing @since tag
  Add missing @since tags
  Remove unused import in ApacheSshTest
  Update maven plugins
  Ignore missing javadoc in test bundles
  storage: file: De-duplicate File.exists()+File.isFile()
  RefDirectory.scanRef: Re-use file existence check done in snapshot creation
  FileSnapshot: Lazy load file store attributes cache
  Update eclipse-jarsigner-plugin to 1.3.2
  Fix p2 repository URLs

Change-Id: I694c011f322f9a19479ef67b9fc725371da7418f
This commit is contained in:
Matthias Sohn 2021-12-04 21:21:52 +01:00
commit caea5a26f0
17 changed files with 55 additions and 16 deletions

View File

@ -125,6 +125,7 @@ public void setUploadPackFactory(UploadPackFactory<HttpServletRequest> f) {
* *
* @param h * @param h
* A custom error handler for git-upload-pack. * A custom error handler for git-upload-pack.
* @since 5.6
*/ */
public void setUploadPackErrorHandler(UploadPackErrorHandler h) { public void setUploadPackErrorHandler(UploadPackErrorHandler h) {
assertNotInitialized(); assertNotInitialized();
@ -163,6 +164,7 @@ public void setReceivePackFactory(ReceivePackFactory<HttpServletRequest> f) {
* *
* @param h * @param h
* A custom error handler for git-receive-pack. * A custom error handler for git-receive-pack.
* @since 5.7
*/ */
public void setReceivePackErrorHandler(ReceivePackErrorHandler h) { public void setReceivePackErrorHandler(ReceivePackErrorHandler h) {
assertNotInitialized(); assertNotInitialized();

View File

@ -31,7 +31,7 @@
* If a custom handler is not specified, JGit will use the default error * If a custom handler is not specified, JGit will use the default error
* handler. * handler.
* *
* @since 5.6 * @since 5.7
*/ */
public interface ReceivePackErrorHandler { public interface ReceivePackErrorHandler {
/** /**

View File

@ -80,6 +80,7 @@ public String toString() {
* @param userGitConfig * @param userGitConfig
* set another user-level git config * set another user-level git config
* @return the old user-level git config * @return the old user-level git config
* @since 5.1.9
*/ */
public FileBasedConfig setUserGitConfig(FileBasedConfig userGitConfig) { public FileBasedConfig setUserGitConfig(FileBasedConfig userGitConfig) {
FileBasedConfig old = this.userGitConfig; FileBasedConfig old = this.userGitConfig;
@ -92,6 +93,7 @@ public FileBasedConfig setUserGitConfig(FileBasedConfig userGitConfig) {
* *
* @param jgitConfig * @param jgitConfig
* set the jgit configuration * set the jgit configuration
* @since 5.5
*/ */
public void setJGitConfig(FileBasedConfig jgitConfig) { public void setJGitConfig(FileBasedConfig jgitConfig) {
this.jgitConfig = jgitConfig; this.jgitConfig = jgitConfig;
@ -103,6 +105,7 @@ public void setJGitConfig(FileBasedConfig jgitConfig) {
* @param systemGitConfig * @param systemGitConfig
* the new system-level git config * the new system-level git config
* @return the old system-level config * @return the old system-level config
* @since 5.1.9
*/ */
public FileBasedConfig setSystemGitConfig(FileBasedConfig systemGitConfig) { public FileBasedConfig setSystemGitConfig(FileBasedConfig systemGitConfig) {
FileBasedConfig old = this.systemGitConfig; FileBasedConfig old = this.systemGitConfig;

View File

@ -60,6 +60,7 @@ public static class RepeatedTestException extends RuntimeException {
* *
* @param message * @param message
* the error message * the error message
* @since 5.1.9
*/ */
public RepeatedTestException(String message) { public RepeatedTestException(String message) {
super(message); super(message);

View File

@ -340,6 +340,7 @@ public static String slashify(String str) {
* greater than then the lastmodification time of lastfile. * greater than then the lastmodification time of lastfile.
* @throws InterruptedException * @throws InterruptedException
* @throws IOException * @throws IOException
* @since 5.1.9
*/ */
public static Instant fsTick(File lastFile) public static Instant fsTick(File lastFile)
throws InterruptedException, throws InterruptedException,

View File

@ -21,6 +21,8 @@
* This class is used when it's required to load jgit classes in separate * This class is used when it's required to load jgit classes in separate
* classloader for each test class. It can be needed to isolate static field * classloader for each test class. It can be needed to isolate static field
* initialization between separate tests. * initialization between separate tests.
*
* @since 5.5
*/ */
public class SeparateClassloaderTestRunner extends BlockJUnit4ClassRunner { public class SeparateClassloaderTestRunner extends BlockJUnit4ClassRunner {

View File

@ -339,6 +339,7 @@ public RevObject get(RevTree tree, String path)
* zero or more IDs of the commit's parents. * zero or more IDs of the commit's parents.
* @return the ID of the new commit. * @return the ID of the new commit.
* @throws Exception * @throws Exception
* @since 5.5
*/ */
public ObjectId unparsedCommit(ObjectId... parents) throws Exception { public ObjectId unparsedCommit(ObjectId... parents) throws Exception {
return unparsedCommit(1, tree(), parents); return unparsedCommit(1, tree(), parents);
@ -431,6 +432,7 @@ public RevCommit commit(final int secDelta, final RevTree tree,
* zero or more IDs of the commit's parents. * zero or more IDs of the commit's parents.
* @return the ID of the new commit. * @return the ID of the new commit.
* @throws Exception * @throws Exception
* @since 5.5
*/ */
public ObjectId unparsedCommit(final int secDelta, final RevTree tree, public ObjectId unparsedCommit(final int secDelta, final RevTree tree,
final ObjectId... parents) throws Exception { final ObjectId... parents) throws Exception {

View File

@ -20,6 +20,8 @@
/** /**
* Utility methods for handling timestamps * Utility methods for handling timestamps
*
* @since 5.1.9
*/ */
public class TimeUtil { public class TimeUtil {
/** /**

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?pde?> <?pde?>
<!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl --> <!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl -->
<target name="jgit-4.17" sequenceNumber="1637746569"> <target name="jgit-4.17" sequenceNumber="1638648728">
<locations> <locations>
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit"> <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
<unit id="jakarta.servlet-api" version="4.0.0"/> <unit id="jakarta.servlet-api" version="4.0.0"/>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?pde?> <?pde?>
<!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl --> <!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl -->
<target name="jgit-4.18" sequenceNumber="1637746569"> <target name="jgit-4.18" sequenceNumber="1638648728">
<locations> <locations>
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit"> <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
<unit id="jakarta.servlet-api" version="4.0.0"/> <unit id="jakarta.servlet-api" version="4.0.0"/>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?pde?> <?pde?>
<!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl --> <!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl -->
<target name="jgit-4.19-staging" sequenceNumber="1637746569"> <target name="jgit-4.19-staging" sequenceNumber="1638648728">
<locations> <locations>
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit"> <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
<unit id="jakarta.servlet-api" version="4.0.0"/> <unit id="jakarta.servlet-api" version="4.0.0"/>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?pde?> <?pde?>
<!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl --> <!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl -->
<target name="jgit-4.20" sequenceNumber="1637746569"> <target name="jgit-4.20" sequenceNumber="1638648728">
<locations> <locations>
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit"> <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
<unit id="jakarta.servlet-api" version="4.0.0"/> <unit id="jakarta.servlet-api" version="4.0.0"/>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?pde?> <?pde?>
<!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl --> <!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl -->
<target name="jgit-4.21" sequenceNumber="1637746569"> <target name="jgit-4.21" sequenceNumber="1638648728">
<locations> <locations>
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit"> <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
<unit id="jakarta.servlet-api" version="4.0.0"/> <unit id="jakarta.servlet-api" version="4.0.0"/>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?pde?> <?pde?>
<!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl --> <!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl -->
<target name="jgit-4.22" sequenceNumber="1637746993"> <target name="jgit-4.22" sequenceNumber="1638648736">
<locations> <locations>
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit"> <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
<unit id="jakarta.servlet-api" version="4.0.0"/> <unit id="jakarta.servlet-api" version="4.0.0"/>

View File

@ -186,6 +186,12 @@ public static FileSnapshot save(Instant modified) {
/** measured FileStore attributes */ /** measured FileStore attributes */
private FileStoreAttributes fileStoreAttributeCache; private FileStoreAttributes fileStoreAttributeCache;
/**
* if {@code true} read filesystem time resolution from configuration file
* otherwise use fallback resolution
*/
private boolean useConfig;
/** /**
* Object that uniquely identifies the given file, or {@code * Object that uniquely identifies the given file, or {@code
* null} if a file key is not available * null} if a file key is not available
@ -222,9 +228,7 @@ protected FileSnapshot(File file) {
protected FileSnapshot(File file, boolean useConfig) { protected FileSnapshot(File file, boolean useConfig) {
this.file = file; this.file = file;
this.lastRead = Instant.now(); this.lastRead = Instant.now();
this.fileStoreAttributeCache = useConfig this.useConfig = useConfig;
? FS.getFileStoreAttributes(file.toPath())
: FALLBACK_FILESTORE_ATTRIBUTES;
BasicFileAttributes fileAttributes = null; BasicFileAttributes fileAttributes = null;
try { try {
fileAttributes = FS.DETECTED.fileAttributes(file); fileAttributes = FS.DETECTED.fileAttributes(file);
@ -379,7 +383,7 @@ public void setClean(FileSnapshot other) {
* if sleep was interrupted * if sleep was interrupted
*/ */
public void waitUntilNotRacy() throws InterruptedException { public void waitUntilNotRacy() throws InterruptedException {
long timestampResolution = fileStoreAttributeCache long timestampResolution = fileStoreAttributeCache()
.getFsTimestampResolution().toNanos(); .getFsTimestampResolution().toNanos();
while (isRacyClean(Instant.now())) { while (isRacyClean(Instant.now())) {
TimeUnit.NANOSECONDS.sleep(timestampResolution); TimeUnit.NANOSECONDS.sleep(timestampResolution);
@ -416,6 +420,15 @@ public boolean equals(Object obj) {
return equals(other); return equals(other);
} }
/**
* Check if the file exists
*
* @return true if the file exists
*/
public boolean fileExists() {
return !MISSING_FILEKEY.equals(this.fileKey);
}
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public int hashCode() { public int hashCode() {
@ -500,10 +513,10 @@ private boolean isRacyClean(Instant read) {
} }
private long getEffectiveRacyThreshold() { private long getEffectiveRacyThreshold() {
long timestampResolution = fileStoreAttributeCache long timestampResolution = fileStoreAttributeCache()
.getFsTimestampResolution().toNanos(); .getFsTimestampResolution().toNanos();
long minRacyInterval = fileStoreAttributeCache.getMinimalRacyInterval() long minRacyInterval = fileStoreAttributeCache()
.toNanos(); .getMinimalRacyInterval().toNanos();
long max = Math.max(timestampResolution, minRacyInterval); long max = Math.max(timestampResolution, minRacyInterval);
// safety margin: factor 2.5 below 100ms otherwise 1.25 // safety margin: factor 2.5 below 100ms otherwise 1.25
return max < 100_000_000L ? max * 5 / 2 : max * 5 / 4; return max < 100_000_000L ? max * 5 / 2 : max * 5 / 4;
@ -563,4 +576,13 @@ private boolean isSizeChanged(long currSize) {
} }
return changed; return changed;
} }
private FileStoreAttributes fileStoreAttributeCache() {
if (fileStoreAttributeCache == null) {
fileStoreAttributeCache = useConfig
? FS.getFileStoreAttributes(file.toPath().getParent())
: FALLBACK_FILESTORE_ATTRIBUTES;
}
return fileStoreAttributeCache;
}
} }

View File

@ -153,7 +153,7 @@ public long getPackSize() {
String p = pack.getAbsolutePath(); String p = pack.getAbsolutePath();
String i = p.substring(0, p.length() - ".pack".length()) + ".idx"; //$NON-NLS-1$ //$NON-NLS-2$ String i = p.substring(0, p.length() - ".pack".length()) + ".idx"; //$NON-NLS-1$ //$NON-NLS-2$
File idx = new File(i); File idx = new File(i);
if (idx.exists() && idx.isFile()) if (idx.isFile())
size += idx.length(); size += idx.length();
return size; return size;
} }

View File

@ -1092,10 +1092,14 @@ LooseRef scanRef(LooseRef ref, String name) throws IOException {
final int limit = 4096; final int limit = 4096;
final byte[] buf; final byte[] buf;
FileSnapshot otherSnapshot = FileSnapshot.save(path); FileSnapshot otherSnapshot = FileSnapshot.save(path);
if (!otherSnapshot.fileExists()) {
return null;
}
try { try {
buf = IO.readSome(path, limit); buf = IO.readSome(path, limit);
} catch (FileNotFoundException noFile) { } catch (FileNotFoundException noFile) {
if (path.exists() && path.isFile()) { if (path.isFile()) {
throw noFile; throw noFile;
} }
return null; // doesn't exist or no file; not a reference. return null; // doesn't exist or no file; not a reference.