Merge "Ensure index change event is fired when index snapshot changed" into stable-5.0
This commit is contained in:
commit
f98112289c
|
@ -56,7 +56,7 @@
|
||||||
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 void onConfigChanged(ConfigChangedEvent event) {
|
||||||
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 @@ private void detectIndexChanges() {
|
||||||
}
|
}
|
||||||
|
|
||||||
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…
Reference in New Issue