From 0be24ebf33974d4f1512644608769cb82d1782ea Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Fri, 18 Mar 2011 08:37:28 -0700 Subject: [PATCH] PackWriter: Remove dummy list 0 Instead of looping over the objectsLists array, always set slot 0 to null and explicitly work on the 4 indexes that matter. This kills some loops and increases the length of the code slightly, but I've always really disliked that dummy 0 slot. Change-Id: I5ad938501c1c61f637ffdaff0d0d88e3962d8942 Signed-off-by: Shawn O. Pearce --- .../org/eclipse/jgit/JGitText.properties | 1 - .../src/org/eclipse/jgit/JGitText.java | 1 - .../eclipse/jgit/storage/pack/PackWriter.java | 64 ++++++++++--------- 3 files changed, 35 insertions(+), 31 deletions(-) diff --git a/org.eclipse.jgit/resources/org/eclipse/jgit/JGitText.properties b/org.eclipse.jgit/resources/org/eclipse/jgit/JGitText.properties index b606bbb24..a19c9c41d 100644 --- a/org.eclipse.jgit/resources/org/eclipse/jgit/JGitText.properties +++ b/org.eclipse.jgit/resources/org/eclipse/jgit/JGitText.properties @@ -214,7 +214,6 @@ improperlyPaddedBase64Input=Improperly padded Base64 input. inMemoryBufferLimitExceeded=In-memory buffer limit exceeded incorrectHashFor=Incorrect hash for {0}; computed {1} as a {2} from {3} bytes. incorrectOBJECT_ID_LENGTH=Incorrect OBJECT_ID_LENGTH. -incorrectObjectType_COMMITnorTREEnorBLOBnorTAG=COMMIT nor TREE nor BLOB nor TAG indexFileIsInUse=Index file is in use indexFileIsTooLargeForJgit=Index file is too large for jgit indexSignatureIsInvalid=Index signature is invalid: {0} diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/JGitText.java b/org.eclipse.jgit/src/org/eclipse/jgit/JGitText.java index 5877b4f6a..f86a8e544 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/JGitText.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/JGitText.java @@ -274,7 +274,6 @@ public static JGitText get() { /***/ public String inMemoryBufferLimitExceeded; /***/ public String incorrectHashFor; /***/ public String incorrectOBJECT_ID_LENGTH; - /***/ public String incorrectObjectType_COMMITnorTREEnorBLOBnorTAG; /***/ public String indexFileIsInUse; /***/ public String indexFileIsTooLargeForJgit; /***/ public String indexSignatureIsInvalid; diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/PackWriter.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/PackWriter.java index bef5816b7..5f3599d8c 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/PackWriter.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/PackWriter.java @@ -139,9 +139,8 @@ public class PackWriter { private static final int PACK_VERSION_GENERATED = 2; @SuppressWarnings("unchecked") - private final List objectsLists[] = new List[Constants.OBJ_TAG + 1]; + private final BlockList objectsLists[] = new BlockList[Constants.OBJ_TAG + 1]; { - objectsLists[0] = Collections. emptyList(); objectsLists[Constants.OBJ_COMMIT] = new BlockList(); objectsLists[Constants.OBJ_TREE] = new BlockList(); objectsLists[Constants.OBJ_BLOB] = new BlockList(); @@ -412,8 +411,12 @@ public void setTagTargets(Set objects) { public long getObjectCount() throws IOException { if (stats.totalObjects == 0) { long objCnt = 0; - for (List list : objectsLists) - objCnt += list.size(); + + objCnt += objectsLists[Constants.OBJ_COMMIT].size(); + objCnt += objectsLists[Constants.OBJ_TREE].size(); + objCnt += objectsLists[Constants.OBJ_BLOB].size(); + objCnt += objectsLists[Constants.OBJ_TAG].size(); + for (CachedPack pack : cachedPacks) objCnt += pack.getObjectCount(); return objCnt; @@ -590,11 +593,16 @@ public void writeIndex(final OutputStream indexStream) throws IOException { private List sortByName() { if (sortedByName == null) { int cnt = 0; - for (List list : objectsLists) - cnt += list.size(); + cnt += objectsLists[Constants.OBJ_COMMIT].size(); + cnt += objectsLists[Constants.OBJ_TREE].size(); + cnt += objectsLists[Constants.OBJ_BLOB].size(); + cnt += objectsLists[Constants.OBJ_TAG].size(); + sortedByName = new BlockList(cnt); - for (List list : objectsLists) - sortedByName.addAll(list); + sortedByName.addAll(objectsLists[Constants.OBJ_COMMIT]); + sortedByName.addAll(objectsLists[Constants.OBJ_TREE]); + sortedByName.addAll(objectsLists[Constants.OBJ_BLOB]); + sortedByName.addAll(objectsLists[Constants.OBJ_TAG]); Collections.sort(sortedByName); } return sortedByName; @@ -707,20 +715,29 @@ public void release() { private void searchForReuse(ProgressMonitor monitor) throws IOException { int cnt = 0; - for (List list : objectsLists) - cnt += list.size(); + cnt += objectsLists[Constants.OBJ_COMMIT].size(); + cnt += objectsLists[Constants.OBJ_TREE].size(); + cnt += objectsLists[Constants.OBJ_BLOB].size(); + cnt += objectsLists[Constants.OBJ_TAG].size(); + long start = System.currentTimeMillis(); monitor.beginTask(JGitText.get().searchForReuse, cnt); - for (List list : objectsLists) { - pruneCurrentObjectList = false; - reuseSupport.selectObjectRepresentation(this, monitor, list); - if (pruneCurrentObjectList) - pruneEdgesFromObjectList(list); - } + searchForReuse(monitor, objectsLists[Constants.OBJ_COMMIT]); + searchForReuse(monitor, objectsLists[Constants.OBJ_TREE]); + searchForReuse(monitor, objectsLists[Constants.OBJ_BLOB]); + searchForReuse(monitor, objectsLists[Constants.OBJ_TAG]); monitor.endTask(); stats.timeSearchingForReuse = System.currentTimeMillis() - start; } + private void searchForReuse(ProgressMonitor monitor, List list) + throws IOException, MissingObjectException { + pruneCurrentObjectList = false; + reuseSupport.selectObjectRepresentation(this, monitor, list); + if (pruneCurrentObjectList) + pruneEdgesFromObjectList(list); + } + private void searchForDeltas(ProgressMonitor monitor) throws MissingObjectException, IncorrectObjectTypeException, IOException { @@ -1472,25 +1489,14 @@ public void addObject(final RevObject object) addObject(object, 0); } - private void addObject(final RevObject object, final int pathHashCode) - throws IncorrectObjectTypeException { + private void addObject(final RevObject object, final int pathHashCode) { final ObjectToPack otp; if (reuseSupport != null) otp = reuseSupport.newObjectToPack(object); else otp = new ObjectToPack(object); otp.setPathHash(pathHashCode); - - try { - objectsLists[object.getType()].add(otp); - } catch (ArrayIndexOutOfBoundsException x) { - throw new IncorrectObjectTypeException(object, - JGitText.get().incorrectObjectType_COMMITnorTREEnorBLOBnorTAG); - } catch (UnsupportedOperationException x) { - // index pointing to "dummy" empty list - throw new IncorrectObjectTypeException(object, - JGitText.get().incorrectObjectType_COMMITnorTREEnorBLOBnorTAG); - } + objectsLists[object.getType()].add(otp); objectsMap.add(otp); }