Merge branch 'stable-5.0'
* stable-5.0: Use constant for ".lock" Simplify locking of FileRepository's index snapshot Refactor FileRepository.detectIndexChange() Change-Id: Ifd427711359bcf38b2c877b2143d45bff0c9895a Signed-off-by: Jonathan Nieder <jrn@google.com>
This commit is contained in:
commit
d2cb1e7bf5
|
@ -45,8 +45,9 @@
|
|||
|
||||
package org.eclipse.jgit.internal.storage.file;
|
||||
|
||||
import static org.eclipse.jgit.lib.Constants.CHARSET;
|
||||
import static org.eclipse.jgit.junit.Assert.assertEquals;
|
||||
import static org.eclipse.jgit.lib.Constants.CHARSET;
|
||||
import static org.eclipse.jgit.lib.Constants.LOCK_SUFFIX;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
|
@ -819,11 +820,11 @@ public void tryRenameWhenLocked(String toLock, String fromName,
|
|||
// Check that the involved refs are the same despite the failure
|
||||
assertExists(false, toName);
|
||||
if (!toLock.equals(toName))
|
||||
assertExists(false, toName + ".lock");
|
||||
assertExists(true, toLock + ".lock");
|
||||
assertExists(false, toName + LOCK_SUFFIX);
|
||||
assertExists(true, toLock + LOCK_SUFFIX);
|
||||
if (!toLock.equals(fromName))
|
||||
assertExists(false, "logs/" + fromName + ".lock");
|
||||
assertExists(false, "logs/" + toName + ".lock");
|
||||
assertExists(false, "logs/" + fromName + LOCK_SUFFIX);
|
||||
assertExists(false, "logs/" + toName + LOCK_SUFFIX);
|
||||
assertEquals(oldHeadId, db.resolve(Constants.HEAD));
|
||||
assertEquals(oldfromId, db.resolve(fromName));
|
||||
assertNull(db.resolve(toName));
|
||||
|
|
|
@ -56,7 +56,6 @@
|
|||
import java.util.Locale;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.locks.ReentrantLock;
|
||||
|
||||
import org.eclipse.jgit.annotations.Nullable;
|
||||
import org.eclipse.jgit.api.errors.JGitInternalException;
|
||||
|
@ -125,7 +124,7 @@ public class FileRepository extends Repository {
|
|||
private final RefDatabase refs;
|
||||
private final ObjectDirectory objectDatabase;
|
||||
|
||||
private final ReentrantLock snapshotLock = new ReentrantLock();
|
||||
private final Object snapshotLock = new Object();
|
||||
|
||||
// protected by snapshotLock
|
||||
private FileSnapshot snapshot;
|
||||
|
@ -553,29 +552,23 @@ private void detectIndexChanges() {
|
|||
}
|
||||
|
||||
File indexFile = getIndexFile();
|
||||
snapshotLock.lock();
|
||||
try {
|
||||
synchronized (snapshotLock) {
|
||||
if (snapshot == null) {
|
||||
snapshot = FileSnapshot.save(indexFile);
|
||||
} else if (snapshot.isModified(indexFile)) {
|
||||
snapshotLock.unlock();
|
||||
notifyIndexChanged(false);
|
||||
return;
|
||||
}
|
||||
} finally {
|
||||
if (snapshotLock.isHeldByCurrentThread()) {
|
||||
snapshotLock.unlock();
|
||||
if (!snapshot.isModified(indexFile)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
notifyIndexChanged(false);
|
||||
}
|
||||
|
||||
/** {@inheritDoc} */
|
||||
@Override
|
||||
public void notifyIndexChanged(boolean internal) {
|
||||
snapshotLock.lock();
|
||||
try {
|
||||
synchronized (snapshotLock) {
|
||||
snapshot = FileSnapshot.save(getIndexFile());
|
||||
} finally {
|
||||
snapshotLock.unlock();
|
||||
}
|
||||
fireEvent(new IndexChangedEvent(internal));
|
||||
}
|
||||
|
|
|
@ -44,6 +44,8 @@
|
|||
|
||||
package org.eclipse.jgit.internal.storage.file;
|
||||
|
||||
import static org.eclipse.jgit.lib.Constants.LOCK_SUFFIX;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
|
@ -74,7 +76,6 @@
|
|||
* name.
|
||||
*/
|
||||
public class LockFile {
|
||||
static final String SUFFIX = ".lock"; //$NON-NLS-1$
|
||||
|
||||
/**
|
||||
* Unlock the given file.
|
||||
|
@ -106,14 +107,15 @@ public static boolean unlock(File file) {
|
|||
* @return lock file
|
||||
*/
|
||||
static File getLockFile(File file) {
|
||||
return new File(file.getParentFile(), file.getName() + SUFFIX);
|
||||
return new File(file.getParentFile(),
|
||||
file.getName() + LOCK_SUFFIX);
|
||||
}
|
||||
|
||||
/** Filter to skip over active lock files when listing a directory. */
|
||||
static final FilenameFilter FILTER = new FilenameFilter() {
|
||||
@Override
|
||||
public boolean accept(File dir, String name) {
|
||||
return !name.endsWith(SUFFIX);
|
||||
return !name.endsWith(LOCK_SUFFIX);
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -46,6 +46,7 @@
|
|||
package org.eclipse.jgit.internal.storage.file;
|
||||
|
||||
import static org.eclipse.jgit.lib.Constants.HEAD;
|
||||
import static org.eclipse.jgit.lib.Constants.LOCK_SUFFIX;
|
||||
import static org.eclipse.jgit.lib.Constants.R_HEADS;
|
||||
import static org.eclipse.jgit.lib.Constants.R_NOTES;
|
||||
import static org.eclipse.jgit.lib.Constants.R_REFS;
|
||||
|
@ -84,7 +85,7 @@ public class ReflogWriter {
|
|||
* @return the name of the ref's lock ref.
|
||||
*/
|
||||
public static String refLockFor(String name) {
|
||||
return name + LockFile.SUFFIX;
|
||||
return name + LOCK_SUFFIX;
|
||||
}
|
||||
|
||||
private final RefDirectory refdb;
|
||||
|
|
|
@ -691,6 +691,13 @@ public static byte[] encode(String str) {
|
|||
public static final ObjectId EMPTY_BLOB_ID = ObjectId
|
||||
.fromString("e69de29bb2d1d6434b8b29ae775ad8c2e48c5391");
|
||||
|
||||
/**
|
||||
* Suffix of lock file name
|
||||
*
|
||||
* @since 5.0
|
||||
*/
|
||||
public static final String LOCK_SUFFIX = ".lock"; //$NON-NLS-1$
|
||||
|
||||
private Constants() {
|
||||
// Hide the default constructor
|
||||
}
|
||||
|
|
|
@ -48,6 +48,8 @@
|
|||
|
||||
package org.eclipse.jgit.lib;
|
||||
|
||||
import static org.eclipse.jgit.lib.Constants.LOCK_SUFFIX;
|
||||
|
||||
import java.io.BufferedOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
|
@ -1368,10 +1370,12 @@ public RepositoryState getRepositoryState() {
|
|||
*/
|
||||
public static boolean isValidRefName(String refName) {
|
||||
final int len = refName.length();
|
||||
if (len == 0)
|
||||
if (len == 0) {
|
||||
return false;
|
||||
if (refName.endsWith(".lock")) //$NON-NLS-1$
|
||||
}
|
||||
if (refName.endsWith(LOCK_SUFFIX)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Refs may be stored as loose files so invalid paths
|
||||
// on the local system must also be invalid refs.
|
||||
|
|
|
@ -43,6 +43,8 @@
|
|||
|
||||
package org.eclipse.jgit.transport;
|
||||
|
||||
import static org.eclipse.jgit.lib.Constants.LOCK_SUFFIX;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
|
@ -344,7 +346,7 @@ OutputStream writeFile(final String path,
|
|||
|
||||
@Override
|
||||
void writeFile(String path, byte[] data) throws IOException {
|
||||
final String lock = path + ".lock"; //$NON-NLS-1$
|
||||
final String lock = path + LOCK_SUFFIX;
|
||||
try {
|
||||
super.writeFile(lock, data);
|
||||
try {
|
||||
|
|
Loading…
Reference in New Issue