final LockFile tmp = myLock;
requireLocked(tmp);
myLock = null;
- if (!tmp.commit())
+ if (!tmp.commit()) {
return false;
+ }
snapshot = tmp.getCommitSnapshot();
if (indexChangedListener != null
- && !Arrays.equals(readIndexChecksum, writeIndexChecksum))
- indexChangedListener.onIndexChanged(new IndexChangedEvent());
+ && !Arrays.equals(readIndexChecksum, writeIndexChecksum)) {
+ indexChangedListener.onIndexChanged(new IndexChangedEvent(true));
+ }
return true;
}
* Describes a change to one or more paths in the index file.
*/
public class IndexChangedEvent extends RepositoryEvent<IndexChangedListener> {
+ private boolean internal;
+
+ /**
+ * Notify that the index changed
+ *
+ * @param internal
+ * {@code true} if the index was changed by the same
+ * JGit process
+ * @since 5.0
+ */
+ public IndexChangedEvent(boolean internal) {
+ this.internal = internal;
+ }
+
+ /**
+ * @return {@code true} if the index was changed by the same JGit process
+ * @since 5.0
+ */
+ public boolean isInternal() {
+ return internal;
+ }
+
/** {@inheritDoc} */
@Override
public Class<IndexChangedListener> getListenerType() {
/** {@inheritDoc} */
@Override
- public void notifyIndexChanged() {
+ public void notifyIndexChanged(boolean internal) {
// Do not send notifications.
// There is no index, as there is no working tree.
}
import java.util.Locale;
import java.util.Objects;
import java.util.Set;
+import java.util.concurrent.atomic.AtomicReference;
import org.eclipse.jgit.annotations.Nullable;
import org.eclipse.jgit.api.errors.JGitInternalException;
private final FileBasedConfig repoConfig;
private final RefDatabase refs;
private final ObjectDirectory objectDatabase;
- private FileSnapshot snapshot;
+
+ private AtomicReference<FileSnapshot> snapshot = new AtomicReference<>();
/**
* Construct a representation of a Git repository.
}
if (!isBare())
- snapshot = FileSnapshot.save(getIndexFile());
+ snapshot.getAndSet(FileSnapshot.save(getIndexFile()));
}
private void loadSystemConfig() throws IOException {
/** Detect index changes. */
private void detectIndexChanges() {
- if (isBare())
+ if (isBare()) {
return;
+ }
File indexFile = getIndexFile();
- if (snapshot == null)
- snapshot = FileSnapshot.save(indexFile);
- else if (snapshot.isModified(indexFile))
- notifyIndexChanged();
+ if (snapshot.get() == null) {
+ snapshot.getAndSet(FileSnapshot.save(indexFile));
+ } else if (snapshot.get().isModified(indexFile)) {
+ notifyIndexChanged(false);
+ }
}
/** {@inheritDoc} */
@Override
- public void notifyIndexChanged() {
- snapshot = FileSnapshot.save(getIndexFile());
- fireEvent(new IndexChangedEvent());
+ public void notifyIndexChanged(boolean internal) {
+ snapshot.getAndSet(FileSnapshot.save(getIndexFile()));
+ fireEvent(new IndexChangedEvent(internal));
}
/** {@inheritDoc} */
IndexChangedListener l = new IndexChangedListener() {
@Override
public void onIndexChanged(IndexChangedEvent event) {
- notifyIndexChanged();
+ notifyIndexChanged(true);
}
};
return DirCache.lock(this, l);
}
/**
- * Force a scan for changed refs.
+ * Force a scan for changed refs. Fires an IndexChangedEvent(false) if
+ * changes are detected.
*
* @throws java.io.IOException
*/
public abstract void scanForRepoChanges() throws IOException;
/**
- * Notify that the index changed
+ * Notify that the index changed by firing an IndexChangedEvent.
+ *
+ * @param internal
+ * {@code true} if the index was changed by the same
+ * JGit process
+ * @since 5.0
*/
- public abstract void notifyIndexChanged();
+ public abstract void notifyIndexChanged(boolean internal);
/**
* Get a shortened more user friendly ref name