|
|
|
@ -66,6 +66,7 @@ import org.eclipse.jgit.errors.UnmergedPathException;
|
|
|
|
|
import org.eclipse.jgit.lib.Constants; |
|
|
|
|
import org.eclipse.jgit.lib.ObjectId; |
|
|
|
|
import org.eclipse.jgit.lib.ObjectInserter; |
|
|
|
|
import org.eclipse.jgit.storage.file.FileSnapshot; |
|
|
|
|
import org.eclipse.jgit.storage.file.LockFile; |
|
|
|
|
import org.eclipse.jgit.util.FS; |
|
|
|
|
import org.eclipse.jgit.util.IO; |
|
|
|
@ -205,9 +206,6 @@ public class DirCache {
|
|
|
|
|
/** Location of the current version of the index file. */ |
|
|
|
|
private final File liveFile; |
|
|
|
|
|
|
|
|
|
/** Modification time of the file at the last read/write we did. */ |
|
|
|
|
private long lastModified; |
|
|
|
|
|
|
|
|
|
/** Individual file index entries, sorted by path name. */ |
|
|
|
|
private DirCacheEntry[] sortedEntries; |
|
|
|
|
|
|
|
|
@ -223,6 +221,9 @@ public class DirCache {
|
|
|
|
|
/** file system abstraction **/ |
|
|
|
|
private final FS fs; |
|
|
|
|
|
|
|
|
|
/** Keep track of whether the index has changed or not */ |
|
|
|
|
private FileSnapshot snapshot; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Create a new in-core index representation. |
|
|
|
|
* <p> |
|
|
|
@ -290,7 +291,7 @@ public class DirCache {
|
|
|
|
|
throw new IOException(JGitText.get().dirCacheDoesNotHaveABackingFile); |
|
|
|
|
if (!liveFile.exists()) |
|
|
|
|
clear(); |
|
|
|
|
else if (liveFile.lastModified() != lastModified) { |
|
|
|
|
else if (snapshot == null || snapshot.isModified(liveFile)) { |
|
|
|
|
try { |
|
|
|
|
final FileInputStream inStream = new FileInputStream(liveFile); |
|
|
|
|
try { |
|
|
|
@ -309,6 +310,7 @@ public class DirCache {
|
|
|
|
|
//
|
|
|
|
|
clear(); |
|
|
|
|
} |
|
|
|
|
snapshot = FileSnapshot.save(liveFile); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -319,12 +321,12 @@ public class DirCache {
|
|
|
|
|
public boolean isOutdated() throws IOException { |
|
|
|
|
if (liveFile == null || !liveFile.exists()) |
|
|
|
|
return false; |
|
|
|
|
return liveFile.lastModified() != lastModified; |
|
|
|
|
return snapshot.isModified(liveFile); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** Empty this index, removing all entries. */ |
|
|
|
|
public void clear() { |
|
|
|
|
lastModified = 0; |
|
|
|
|
snapshot = null; |
|
|
|
|
sortedEntries = NO_ENTRIES; |
|
|
|
|
entryCnt = 0; |
|
|
|
|
tree = null; |
|
|
|
@ -361,7 +363,7 @@ public class DirCache {
|
|
|
|
|
final MutableInteger infoAt = new MutableInteger(); |
|
|
|
|
for (int i = 0; i < entryCnt; i++) |
|
|
|
|
sortedEntries[i] = new DirCacheEntry(infos, infoAt, in, md); |
|
|
|
|
lastModified = liveFile.lastModified(); |
|
|
|
|
snapshot = FileSnapshot.save(liveFile); |
|
|
|
|
|
|
|
|
|
// After the file entries are index extensions, and then a footer.
|
|
|
|
|
//
|
|
|
|
@ -516,14 +518,14 @@ public class DirCache {
|
|
|
|
|
|
|
|
|
|
// Write the individual file entries.
|
|
|
|
|
//
|
|
|
|
|
if (lastModified <= 0) { |
|
|
|
|
if (snapshot == null) { |
|
|
|
|
// Write a new index, as no entries require smudging.
|
|
|
|
|
//
|
|
|
|
|
for (int i = 0; i < entryCnt; i++) |
|
|
|
|
sortedEntries[i].write(dos); |
|
|
|
|
} else { |
|
|
|
|
final int smudge_s = (int) (lastModified / 1000); |
|
|
|
|
final int smudge_ns = ((int) (lastModified % 1000)) * 1000000; |
|
|
|
|
final int smudge_s = (int) (snapshot.lastModified() / 1000); |
|
|
|
|
final int smudge_ns = ((int) (snapshot.lastModified() % 1000)) * 1000000; |
|
|
|
|
for (int i = 0; i < entryCnt; i++) { |
|
|
|
|
final DirCacheEntry e = sortedEntries[i]; |
|
|
|
|
if (e.mightBeRacilyClean(smudge_s, smudge_ns)) |
|
|
|
@ -564,7 +566,7 @@ public class DirCache {
|
|
|
|
|
myLock = null; |
|
|
|
|
if (!tmp.commit()) |
|
|
|
|
return false; |
|
|
|
|
lastModified = tmp.getCommitLastModified(); |
|
|
|
|
snapshot = tmp.getCommitSnapshot(); |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|