Packs with newer modification dates are more likely to contain data related to recent commits, and thus will have a better probability of containing an object we care about when we are looking only at recent history. In some cases, this may permit JGit to avoid reading a very large historical pack's index file into memory if the only data we ever need is available in newer pack files. Signed-off-by: Shawn O. Pearce <spearce@xxxxxxxxxxx> --- .../src/org/spearce/jgit/lib/PackFile.java | 11 +++++++++++ .../src/org/spearce/jgit/lib/Repository.java | 1 + 2 files changed, 12 insertions(+), 0 deletions(-) diff --git a/org.spearce.jgit/src/org/spearce/jgit/lib/PackFile.java b/org.spearce.jgit/src/org/spearce/jgit/lib/PackFile.java index 3542560..7a16bf7 100644 --- a/org.spearce.jgit/src/org/spearce/jgit/lib/PackFile.java +++ b/org.spearce.jgit/src/org/spearce/jgit/lib/PackFile.java @@ -43,6 +43,7 @@ import java.io.IOException; import java.io.OutputStream; import java.util.Collections; +import java.util.Comparator; import java.util.Iterator; import java.util.zip.CRC32; import java.util.zip.CheckedOutputStream; @@ -57,10 +58,19 @@ * objects are similar. */ public class PackFile implements Iterable<PackIndex.MutableEntry> { + /** Sorts PackFiles to be most recently created to least recently created. */ + public static Comparator<PackFile> SORT = new Comparator<PackFile>() { + public int compare(final PackFile a, final PackFile b) { + return b.packLastModified - a.packLastModified; + } + }; + private final File idxFile; private final WindowedFile pack; + private int packLastModified; + private PackIndex loadedIdx; private PackReverseIndex reverseIdx; @@ -75,6 +85,7 @@ */ public PackFile(final File idxFile, final File packFile) { this.idxFile = idxFile; + this.packLastModified = (int) (packFile.lastModified() >> 10); pack = new WindowedFile(packFile) { @Override protected void onOpen() throws IOException { diff --git a/org.spearce.jgit/src/org/spearce/jgit/lib/Repository.java b/org.spearce.jgit/src/org/spearce/jgit/lib/Repository.java index b9c7b2e..96c62df 100644 --- a/org.spearce.jgit/src/org/spearce/jgit/lib/Repository.java +++ b/org.spearce.jgit/src/org/spearce/jgit/lib/Repository.java @@ -823,6 +823,7 @@ public void scanForPacks() { scanForPacks(new File(d, "pack"), p); final PackFile[] arr = new PackFile[p.size()]; p.toArray(arr); + Arrays.sort(arr, PackFile.SORT); synchronized (this) { packFileList = arr; } -- 1.6.2.rc0.204.gf6b427 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html