diff --git a/org.eclipse.jgit/resources/org/eclipse/jgit/internal/JGitText.properties b/org.eclipse.jgit/resources/org/eclipse/jgit/internal/JGitText.properties index b0ce1582d..55cf3ea71 100644 --- a/org.eclipse.jgit/resources/org/eclipse/jgit/internal/JGitText.properties +++ b/org.eclipse.jgit/resources/org/eclipse/jgit/internal/JGitText.properties @@ -145,6 +145,7 @@ couldNotRenameTemporaryIndexFileToIndex=Could not rename temporary index file to couldNotURLEncodeToUTF8=Could not URL encode to UTF-8 couldNotWriteFile=Could not write file {0} countingObjects=Counting objects +corruptPack=Pack file {0} is corrupt createBranchFailedUnknownReason=Create branch failed for unknown reason createBranchUnexpectedResult=Create branch returned unexpected result {0} createNewFileFailed=Could not create new file {0} diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java index 5f42e8189..fd38dc149 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java @@ -190,6 +190,7 @@ public static JGitText get() { /***/ public String corruptObjectNotree; /***/ public String corruptObjectNoType; /***/ public String corruptObjectPackfileChecksumIncorrect; + /***/ public String corruptPack; /***/ public String couldNotCheckOutBecauseOfConflicts; /***/ public String couldNotDeleteLockFileShouldNotHappen; /***/ public String couldNotDeleteTemporaryIndexFileShouldNotHappen; diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ObjectDirectory.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ObjectDirectory.java index 0b83efa62..76fadefe5 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ObjectDirectory.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ObjectDirectory.java @@ -66,6 +66,8 @@ import java.util.Set; import java.util.concurrent.atomic.AtomicReference; +import org.eclipse.jgit.errors.CorruptObjectException; +import org.eclipse.jgit.errors.PackInvalidException; import org.eclipse.jgit.errors.PackMismatchException; import org.eclipse.jgit.internal.JGitText; import org.eclipse.jgit.internal.storage.pack.ObjectToPack; @@ -330,9 +332,7 @@ void resolve(Set matches, AbbreviatedObjectId id) try { p.resolve(matches, id, RESOLVE_ABBREV_LIMIT); } catch (IOException e) { - // Assume the pack is corrupted. - logCorruptPackError(e, p); - removePack(p); + handlePackError(e, p); } if (matches.size() > RESOLVE_ABBREV_LIMIT) return; @@ -419,9 +419,7 @@ ObjectLoader openPackedObject(WindowCursor curs, AnyObjectId objectId) { if (searchPacksAgain(pList)) continue SEARCH; } catch (IOException e) { - // Assume the pack is corrupted. - logCorruptPackError(e, p); - removePack(p); + handlePackError(e, p); } } break SEARCH; @@ -501,9 +499,7 @@ private long getPackedObjectSize(WindowCursor curs, AnyObjectId id) { if (searchPacksAgain(pList)) continue SEARCH; } catch (IOException e) { - // Assume the pack is corrupted. - logCorruptPackError(e, p); - removePack(p); + handlePackError(e, p); } } break SEARCH; @@ -544,9 +540,7 @@ void selectObjectRepresentation(PackWriter packer, ObjectToPack otp, pList = scanPacks(pList); continue SEARCH; } catch (IOException e) { - // Assume the pack is corrupted. - logCorruptPackError(e, p); - removePack(p); + handlePackError(e, p); } } break SEARCH; @@ -556,9 +550,19 @@ void selectObjectRepresentation(PackWriter packer, ObjectToPack otp, h.db.selectObjectRepresentation(packer, otp, curs); } - private static void logCorruptPackError(IOException e, PackFile p) { - StringBuilder buf = new StringBuilder(MessageFormat.format( - JGitText.get().exceptionWhileReadingPack, + private void handlePackError(IOException e, PackFile p) { + String tmpl; + if ((e instanceof CorruptObjectException) + || (e instanceof PackInvalidException)) { + tmpl = JGitText.get().corruptPack; + // Assume the pack is corrupted, and remove it from the list. + removePack(p); + } else { + tmpl = JGitText.get().exceptionWhileReadingPack; + // Don't remove the pack from the list, as the error may be + // transient. + } + StringBuilder buf = new StringBuilder(MessageFormat.format(tmpl, p.getPackFile().getAbsolutePath())); StringWriter sw = new StringWriter(); e.printStackTrace(new PrintWriter(sw));