diff --git a/org.eclipse.jgit.pgm/resources/org/eclipse/jgit/pgm/CLIText.properties b/org.eclipse.jgit.pgm/resources/org/eclipse/jgit/pgm/CLIText.properties index b117cf04c..01b3fba9c 100644 --- a/org.eclipse.jgit.pgm/resources/org/eclipse/jgit/pgm/CLIText.properties +++ b/org.eclipse.jgit.pgm/resources/org/eclipse/jgit/pgm/CLIText.properties @@ -110,6 +110,7 @@ notAValidRefName={0} is not a valid ref name notAnIndexFile={0} is not an index file notAnObject={0} is not an object notFound=!! NOT FOUND !! +noteObjectTooLargeToPrint=Note object {0} too large to print onlyOneMetaVarExpectedIn=Only one {0} expected in {1}. pushTo=To {0} remoteMessage=remote: {0} diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/CLIText.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/CLIText.java index dd0f6dbea..1c7e93634 100644 --- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/CLIText.java +++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/CLIText.java @@ -130,6 +130,7 @@ public class CLIText extends TranslationBundle { /***/ public String notAnIndexFile; /***/ public String notAnObject; /***/ public String notFound; + /***/ public String noteObjectTooLargeToPrint; /***/ public String onlyOneMetaVarExpectedIn; /***/ public String pushTo; /***/ public String remoteMessage; diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Log.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Log.java index d27793c5b..4a92ea624 100644 --- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Log.java +++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Log.java @@ -64,16 +64,15 @@ import org.eclipse.jgit.diff.DiffFormatter; import org.eclipse.jgit.diff.RawText; import org.eclipse.jgit.diff.RawTextComparator; import org.eclipse.jgit.diff.RenameDetector; +import org.eclipse.jgit.errors.LargeObjectException; import org.eclipse.jgit.lib.AnyObjectId; import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.ObjectId; -import org.eclipse.jgit.lib.ObjectReader; import org.eclipse.jgit.lib.PersonIdent; import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.notes.NoteMap; import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevTree; -import org.eclipse.jgit.revwalk.RevWalk; import org.kohsuke.args4j.Option; @Command(common = true, usage = "usage_viewCommitHistory") @@ -89,10 +88,6 @@ class Log extends RevWalkTextBuiltin { private Map noteMaps; - private ObjectReader reader; - - private RevWalk revWalk; - @Option(name="--decorate", usage="usage_showRefNamesMatchingCommits") private boolean decorate; @@ -182,14 +177,6 @@ class Log extends RevWalkTextBuiltin { fmt = new SimpleDateFormat("EEE MMM dd HH:mm:ss yyyy ZZZZZ", Locale.US); } - @Override - protected RevWalk createWalk() { - RevWalk ret = super.createWalk(); - if (decorate) - allRefsByPeeledObjectId = getRepository().getAllRefsByPeeledObjectId(); - return ret; - } - @Override protected void run() throws Exception { diffFmt.setRepository(db); @@ -202,40 +189,39 @@ class Log extends RevWalkTextBuiltin { rd.setRenameLimit(renameLimit.intValue()); } - if (!noStandardNotes || additionalNoteRefs != null) { - reader = db.newObjectReader(); - revWalk = new RevWalk(db); + if (!noStandardNotes || !additionalNoteRefs.isEmpty()) { + createWalk(); noteMaps = new LinkedHashMap(); if (!noStandardNotes) { - noteMaps.put(Constants.R_NOTES_COMMITS, - getNoteMap(Constants.R_NOTES_COMMITS)); + addNoteMap(Constants.R_NOTES_COMMITS); } - if (additionalNoteRefs != null) { + if (!additionalNoteRefs.isEmpty()) { for (String notesRef : additionalNoteRefs) { if (!notesRef.startsWith(Constants.R_NOTES)) { notesRef = Constants.R_NOTES + notesRef; } - noteMaps.put(notesRef, getNoteMap(notesRef)); + addNoteMap(notesRef); } } } + if (decorate) + allRefsByPeeledObjectId = getRepository() + .getAllRefsByPeeledObjectId(); + super.run(); } finally { diffFmt.release(); - if (reader != null) - reader.release(); - if (revWalk != null) - revWalk.release(); } } - private NoteMap getNoteMap(String notesRef) throws IOException { + private void addNoteMap(String notesRef) throws IOException { Ref notes = db.getRef(notesRef); if (notes == null) - return null; - RevCommit notesCommit = revWalk.parseCommit(notes.getObjectId()); - return NoteMap.read(reader, notesCommit); + return; + RevCommit notesCommit = argWalk.parseCommit(notes.getObjectId()); + noteMaps.put(notesRef, + NoteMap.read(argWalk.getObjectReader(), notesCommit)); } @Override @@ -304,7 +290,7 @@ class Log extends RevWalkTextBuiltin { } boolean printedNote = showNotes(c, e.getValue(), label, printEmptyLine); - atLeastOnePrinted = atLeastOnePrinted || printedNote; + atLeastOnePrinted |= printedNote; printEmptyLine = printedNote; } return atLeastOnePrinted; @@ -334,12 +320,16 @@ class Log extends RevWalkTextBuiltin { out.print(")"); } out.println(":"); - RawText rawText = new RawText(reader.open(blobId).getBytes()); - String s = rawText.getString(0, rawText.size(), false); - final String[] lines = s.split("\n"); - for (final String l : lines) { - out.print(" "); - out.println(l); + try { + RawText rawText = new RawText(argWalk.getObjectReader() + .open(blobId).getCachedBytes(Integer.MAX_VALUE)); + for (int i = 0; i < rawText.size(); i++) { + out.print(" "); + out.println(rawText.getString(i)); + } + } catch (LargeObjectException e) { + out.println(MessageFormat.format( + CLIText.get().noteObjectTooLargeToPrint, blobId.name())); } return true; } diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/RevWalkTextBuiltin.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/RevWalkTextBuiltin.java index 768890c85..474e974cd 100644 --- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/RevWalkTextBuiltin.java +++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/RevWalkTextBuiltin.java @@ -199,10 +199,8 @@ abstract class RevWalkTextBuiltin extends TextBuiltin { } protected RevWalk createWalk() { - if (objects) - return new ObjectWalk(db); if (argWalk == null) - argWalk = new RevWalk(db); + argWalk = objects ? new ObjectWalk(db) : new RevWalk(db); return argWalk; }