Browse Source

Ensure index change event is fired when index snapshot changed

Ensure that notifyIndexChanged is called every time we call
FileSnapshot.save, except the first.

Change-Id: I5a4e9826e791f518787366ae7c3a0ef3d416d2c1
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
stable-5.0
Matthias Sohn 7 years ago
parent
commit
a3738ef137
  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.Objects;
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.api.errors.JGitInternalException;
@ -125,7 +125,10 @@ public class FileRepository extends Repository {
private final RefDatabase refs;
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.
@ -240,8 +243,9 @@ public class FileRepository extends Repository {
Long.valueOf(repositoryFormatVersion)));
}
if (!isBare())
snapshot.getAndSet(FileSnapshot.save(getIndexFile()));
if (!isBare()) {
snapshot = FileSnapshot.save(getIndexFile());
}
}
private void loadSystemConfig() throws IOException {
@ -549,17 +553,30 @@ public class FileRepository extends Repository {
}
File indexFile = getIndexFile();
if (snapshot.get() == null) {
snapshot.getAndSet(FileSnapshot.save(indexFile));
} else if (snapshot.get().isModified(indexFile)) {
notifyIndexChanged(false);
snapshotLock.lock();
try {
if (snapshot == null) {
snapshot = FileSnapshot.save(indexFile);
} else if (snapshot.isModified(indexFile)) {
snapshotLock.unlock();
notifyIndexChanged(false);
}
} finally {
if (snapshotLock.isHeldByCurrentThread()) {
snapshotLock.unlock();
}
}
}
/** {@inheritDoc} */
@Override
public void notifyIndexChanged(boolean internal) {
snapshot.getAndSet(FileSnapshot.save(getIndexFile()));
snapshotLock.lock();
try {
snapshot = FileSnapshot.save(getIndexFile());
} finally {
snapshotLock.unlock();
}
fireEvent(new IndexChangedEvent(internal));
}

Loading…
Cancel
Save