From 5f3d577e5a1e8f23a2b6ea6a2bf24516806e01b8 Mon Sep 17 00:00:00 2001 From: Sasa Zivkov Date: Mon, 21 Feb 2011 16:43:06 +0100 Subject: [PATCH] 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 --- org.eclipse.jgit.pgm/META-INF/MANIFEST.MF | 1 + .../org/eclipse/jgit/pgm/CLIText.properties | 3 + .../src/org/eclipse/jgit/pgm/Log.java | 120 ++++++++++++++++++ .../src/org/eclipse/jgit/lib/Constants.java | 6 + 4 files changed, 130 insertions(+) diff --git a/org.eclipse.jgit.pgm/META-INF/MANIFEST.MF b/org.eclipse.jgit.pgm/META-INF/MANIFEST.MF index f27bcf5fd..9825031ce 100644 --- a/org.eclipse.jgit.pgm/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit.pgm/META-INF/MANIFEST.MF @@ -15,6 +15,7 @@ Import-Package: org.eclipse.jgit.api;version="[0.12.0,0.13.0)", org.eclipse.jgit.iplog;version="[0.12.0,0.13.0)", org.eclipse.jgit.lib;version="[0.12.0,0.13.0)", org.eclipse.jgit.nls;version="[0.12.0,0.13.0)", + org.eclipse.jgit.notes;version="[0.12.0,0.13.0)", org.eclipse.jgit.revplot;version="[0.12.0,0.13.0)", org.eclipse.jgit.revwalk;version="[0.12.0,0.13.0)", org.eclipse.jgit.revwalk.filter;version="[0.12.0,0.13.0)", 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 c1b5c5344..b117cf04c 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 @@ -82,6 +82,7 @@ metaVar_pass=PASS metaVar_path=path metaVar_paths=path ... metaVar_port=PORT +metaVar_ref=REF metaVar_refs=REFS metaVar_refspec=refspec metaVar_remoteName=name @@ -181,6 +182,7 @@ usage_moveRenameABranch=move/rename a branch usage_nameStatus=show only name and status of files usage_noPrefix=do not show any source or destination prefix usage_noRenames=disable rename detection +usage_noShowStandardNotes=Disable showing notes from the standard /refs/notes/commits branch usage_onlyMatchAgainstAlreadyTrackedFiles=Only match against already tracked files in the index rather than the working tree usage_outputFile=Output file usage_path=path @@ -198,6 +200,7 @@ usage_resetMixed=Resets the index but not the working tree usage_setTheGitRepositoryToOperateOn=set the git repository to operate on usage_showPatch=display patch usage_showRefNamesMatchingCommits=Show ref names matching commits +usage_showNotes=Add this ref to the list of note branches from which notes are displayed usage_srcPrefix=show the source prefix instead of "a/" usage_symbolicVersionForTheProject=Symbolic version for the project usage_synchronizeIPZillaData=Synchronize IPZilla data 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 0ce774b27..d27793c5b 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> allRefsByPeeledObjectId; + private Map 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 additionalNoteRefs = new ArrayList(); + + @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(); + 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 true if at least one note was printed, + * false otherwise + * @throws IOException + */ + private boolean showNotes(RevCommit c) throws IOException { + if (noteMaps == null) + return false; + + boolean printEmptyLine = false; + boolean atLeastOnePrinted = false; + for (Map.Entry 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 true if note was printed, false + * 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(); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/Constants.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/Constants.java index 139093a08..0290689c8 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/Constants.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/Constants.java @@ -240,6 +240,12 @@ public final class Constants { /** Prefix for tag refs */ public static final String R_TAGS = "refs/tags/"; + /** Prefix for notes refs */ + public static final String R_NOTES = "refs/notes/"; + + /** Standard notes ref */ + public static final String R_NOTES_COMMITS = R_NOTES + "commits"; + /** Prefix for any ref */ public static final String R_REFS = "refs/";