This allows to differentiate if index was changed by an external git command or by JGit itself. Change-Id: Iae692ba7d9bf01a288b3fb2dc2d07aec9891c712 Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>tags/v5.0.0.201805151920-m7
@@ -737,12 +737,14 @@ public class DirCache { | |||
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; | |||
} | |||
@@ -47,6 +47,28 @@ package org.eclipse.jgit.events; | |||
* 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() { |
@@ -133,7 +133,7 @@ public abstract class DfsRepository extends Repository { | |||
/** {@inheritDoc} */ | |||
@Override | |||
public void notifyIndexChanged() { | |||
public void notifyIndexChanged(boolean internal) { | |||
// Do not send notifications. | |||
// There is no index, as there is no working tree. | |||
} |
@@ -58,6 +58,7 @@ import java.util.HashSet; | |||
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; | |||
@@ -125,7 +126,8 @@ public class FileRepository extends Repository { | |||
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. | |||
@@ -241,7 +243,7 @@ public class FileRepository extends Repository { | |||
} | |||
if (!isBare()) | |||
snapshot = FileSnapshot.save(getIndexFile()); | |||
snapshot.getAndSet(FileSnapshot.save(getIndexFile())); | |||
} | |||
private void loadSystemConfig() throws IOException { | |||
@@ -544,21 +546,23 @@ public class FileRepository extends Repository { | |||
/** 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} */ |
@@ -1267,7 +1267,7 @@ public abstract class Repository implements AutoCloseable { | |||
IndexChangedListener l = new IndexChangedListener() { | |||
@Override | |||
public void onIndexChanged(IndexChangedEvent event) { | |||
notifyIndexChanged(); | |||
notifyIndexChanged(true); | |||
} | |||
}; | |||
return DirCache.lock(this, l); | |||
@@ -1560,16 +1560,22 @@ public abstract class Repository implements AutoCloseable { | |||
} | |||
/** | |||
* 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 |