diff options
author | Sasa Zivkov <sasa.zivkov@sap.com> | 2011-02-21 16:43:06 +0100 |
---|---|---|
committer | Chris Aniszczyk <caniszczyk@gmail.com> | 2011-02-23 09:32:23 -0600 |
commit | 5f3d577e5a1e8f23a2b6ea6a2bf24516806e01b8 (patch) | |
tree | 30fdb0df79177e6903b3bb118867fb186098b6a0 /org.eclipse.jgit.pgm/src | |
parent | 977446e5da257408a3ac1ec9eb3c2258d0bcf061 (diff) | |
download | jgit-5f3d577e5a1e8f23a2b6ea6a2bf24516806e01b8.tar.gz jgit-5f3d577e5a1e8f23a2b6ea6a2bf24516806e01b8.zip |
Show notes in Log CLI command
Support for --no-standard-notes and --show-notes=REF options is added
to the Log command. The --show-notes option can be specified more than
once if more than one notes branch should be used for showing notes.
The notes are displayed from note branches in the order how the note
branches are specified in the command line. However, the standard note,
from the refs/notes/commits, is always displayed as first unless
the --no-standard-notes options is given.
Change-Id: I4e7940804ed9d388b625b8e8a8e25bfcf5ee15a6
Signed-off-by: Chris Aniszczyk <caniszczyk@gmail.com>
Diffstat (limited to 'org.eclipse.jgit.pgm/src')
-rw-r--r-- | org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Log.java | 120 |
1 files changed, 120 insertions, 0 deletions
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 0ce774b27d..d27793c5be 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 @@ -50,20 +50,27 @@ import java.io.IOException; import java.text.DateFormat; import java.text.MessageFormat; import java.text.SimpleDateFormat; +import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Set; import java.util.TimeZone; 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.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; @@ -80,9 +87,25 @@ class Log extends RevWalkTextBuiltin { private Map<AnyObjectId, Set<Ref>> allRefsByPeeledObjectId; + private Map<String, NoteMap> noteMaps; + + private ObjectReader reader; + + private RevWalk revWalk; + @Option(name="--decorate", usage="usage_showRefNamesMatchingCommits") private boolean decorate; + @Option(name = "--no-standard-notes", usage = "usage_noShowStandardNotes") + private boolean noStandardNotes; + + private List<String> additionalNoteRefs = new ArrayList<String>(); + + @Option(name = "--show-notes", usage = "usage_showNotes", metaVar = "metaVar_ref") + void addAdditionalNoteRef(String notesRef) { + additionalNoteRefs.add(notesRef); + } + // BEGIN -- Options shared with Diff @Option(name = "-p", usage = "usage_showPatch") boolean showPatch; @@ -154,6 +177,7 @@ class Log extends RevWalkTextBuiltin { // END -- Options shared with Diff + Log() { fmt = new SimpleDateFormat("EEE MMM dd HH:mm:ss yyyy ZZZZZ", Locale.US); } @@ -178,12 +202,42 @@ class Log extends RevWalkTextBuiltin { rd.setRenameLimit(renameLimit.intValue()); } + if (!noStandardNotes || additionalNoteRefs != null) { + reader = db.newObjectReader(); + revWalk = new RevWalk(db); + noteMaps = new LinkedHashMap<String, NoteMap>(); + if (!noStandardNotes) { + noteMaps.put(Constants.R_NOTES_COMMITS, + getNoteMap(Constants.R_NOTES_COMMITS)); + } + if (additionalNoteRefs != null) { + for (String notesRef : additionalNoteRefs) { + if (!notesRef.startsWith(Constants.R_NOTES)) { + notesRef = Constants.R_NOTES + notesRef; + } + noteMaps.put(notesRef, getNoteMap(notesRef)); + } + } + } + super.run(); } finally { diffFmt.release(); + if (reader != null) + reader.release(); + if (revWalk != null) + revWalk.release(); } } + private NoteMap getNoteMap(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); + } + @Override protected void show(final RevCommit c) throws Exception { out.print(CLIText.get().commitLabel); @@ -219,11 +273,77 @@ class Log extends RevWalkTextBuiltin { } out.println(); + if (showNotes(c)) + out.println(); + if (c.getParentCount() == 1 && (showNameAndStatusOnly || showPatch)) showDiff(c); out.flush(); } + /** + * @param c + * @return <code>true</code> if at least one note was printed, + * <code>false</code> otherwise + * @throws IOException + */ + private boolean showNotes(RevCommit c) throws IOException { + if (noteMaps == null) + return false; + + boolean printEmptyLine = false; + boolean atLeastOnePrinted = false; + for (Map.Entry<String, NoteMap> e : noteMaps.entrySet()) { + String label = null; + String notesRef = e.getKey(); + if (! notesRef.equals(Constants.R_NOTES_COMMITS)) { + if (notesRef.startsWith(Constants.R_NOTES)) + label = notesRef.substring(Constants.R_NOTES.length()); + else + label = notesRef; + } + boolean printedNote = showNotes(c, e.getValue(), label, + printEmptyLine); + atLeastOnePrinted = atLeastOnePrinted || printedNote; + printEmptyLine = printedNote; + } + return atLeastOnePrinted; + } + + /** + * @param c + * @param map + * @param label + * @param emptyLine + * @return <code>true</code> if note was printed, <code>false</code> + * otherwise + * @throws IOException + */ + private boolean showNotes(RevCommit c, NoteMap map, String label, + boolean emptyLine) + throws IOException { + ObjectId blobId = map.get(c); + if (blobId == null) + return false; + if (emptyLine) + out.println(); + out.print("Notes"); + if (label != null) { + out.print(" ("); + out.print(label); + 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); + } + return true; + } + private void showDiff(RevCommit c) throws IOException { final RevTree a = c.getParent(0).getTree(); final RevTree b = c.getTree(); |