Browse Source

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>
stable-5.1
Jonathan Nieder 7 years ago
parent
commit
d2cb1e7bf5
  1. 11
      org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/RefUpdateTest.java
  2. 21
      org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileRepository.java
  3. 8
      org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/LockFile.java
  4. 3
      org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ReflogWriter.java
  5. 7
      org.eclipse.jgit/src/org/eclipse/jgit/lib/Constants.java
  6. 8
      org.eclipse.jgit/src/org/eclipse/jgit/lib/Repository.java
  7. 4
      org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportSftp.java

11
org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/RefUpdateTest.java

@ -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 class RefUpdateTest extends SampleDataRepositoryTestCase {
// 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));

21
org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileRepository.java

@ -56,7 +56,6 @@ import java.util.HashSet;
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 @@ public class FileRepository extends Repository {
}
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));
}

8
org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/LockFile.java

@ -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 @@ import org.eclipse.jgit.util.FileUtils;
* name.
*/
public class LockFile {
static final String SUFFIX = ".lock"; //$NON-NLS-1$
/**
* Unlock the given file.
@ -106,14 +107,15 @@ public class LockFile {
* @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);
}
};

3
org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ReflogWriter.java

@ -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;

7
org.eclipse.jgit/src/org/eclipse/jgit/lib/Constants.java

@ -691,6 +691,13 @@ public final class Constants {
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
}

8
org.eclipse.jgit/src/org/eclipse/jgit/lib/Repository.java

@ -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 abstract class Repository implements AutoCloseable {
*/
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.

4
org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportSftp.java

@ -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 @@ public class TransportSftp extends SshTransport implements WalkTransport {
@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…
Cancel
Save