Browse Source

Merge "Ensure index change event is fired when index snapshot changed" into stable-5.0

stable-5.0
Jonathan Nieder 7 years ago committed by Gerrit Code Review @ Eclipse.org
parent
commit
f98112289c
  1. 35
      org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileRepository.java

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

@ -56,7 +56,7 @@ import java.util.HashSet;
import java.util.Locale; import java.util.Locale;
import java.util.Objects; import java.util.Objects;
import java.util.Set; import java.util.Set;
import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.locks.ReentrantLock;
import org.eclipse.jgit.annotations.Nullable; import org.eclipse.jgit.annotations.Nullable;
import org.eclipse.jgit.api.errors.JGitInternalException; import org.eclipse.jgit.api.errors.JGitInternalException;
@ -125,7 +125,10 @@ public class FileRepository extends Repository {
private final RefDatabase refs; private final RefDatabase refs;
private final ObjectDirectory objectDatabase; private final ObjectDirectory objectDatabase;
private AtomicReference<FileSnapshot> snapshot = new AtomicReference<>(); private final ReentrantLock snapshotLock = new ReentrantLock();
// protected by snapshotLock
private FileSnapshot snapshot;
/** /**
* Construct a representation of a Git repository. * Construct a representation of a Git repository.
@ -240,8 +243,9 @@ public class FileRepository extends Repository {
Long.valueOf(repositoryFormatVersion))); Long.valueOf(repositoryFormatVersion)));
} }
if (!isBare()) if (!isBare()) {
snapshot.getAndSet(FileSnapshot.save(getIndexFile())); snapshot = FileSnapshot.save(getIndexFile());
}
} }
private void loadSystemConfig() throws IOException { private void loadSystemConfig() throws IOException {
@ -549,17 +553,30 @@ public class FileRepository extends Repository {
} }
File indexFile = getIndexFile(); File indexFile = getIndexFile();
if (snapshot.get() == null) { snapshotLock.lock();
snapshot.getAndSet(FileSnapshot.save(indexFile)); try {
} else if (snapshot.get().isModified(indexFile)) { if (snapshot == null) {
notifyIndexChanged(false); snapshot = FileSnapshot.save(indexFile);
} else if (snapshot.isModified(indexFile)) {
snapshotLock.unlock();
notifyIndexChanged(false);
}
} finally {
if (snapshotLock.isHeldByCurrentThread()) {
snapshotLock.unlock();
}
} }
} }
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public void notifyIndexChanged(boolean internal) { public void notifyIndexChanged(boolean internal) {
snapshot.getAndSet(FileSnapshot.save(getIndexFile())); snapshotLock.lock();
try {
snapshot = FileSnapshot.save(getIndexFile());
} finally {
snapshotLock.unlock();
}
fireEvent(new IndexChangedEvent(internal)); fireEvent(new IndexChangedEvent(internal));
} }

Loading…
Cancel
Save