]> source.dussan.org Git - jgit.git/commitdiff
Show notes in Log CLI command 64/2564/3
authorSasa Zivkov <sasa.zivkov@sap.com>
Mon, 21 Feb 2011 15:43:06 +0000 (16:43 +0100)
committerChris Aniszczyk <caniszczyk@gmail.com>
Wed, 23 Feb 2011 15:32:23 +0000 (09:32 -0600)
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>
org.eclipse.jgit.pgm/META-INF/MANIFEST.MF
org.eclipse.jgit.pgm/resources/org/eclipse/jgit/pgm/CLIText.properties
org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Log.java
org.eclipse.jgit/src/org/eclipse/jgit/lib/Constants.java

index f27bcf5fd9bdbb67fb60dc4a553a1df8380934ef..9825031ce22638e7756c5749a28647673580bb61 100644 (file)
@@ -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)",
index c1b5c5344389e5077970b5a6a247176e91c4e27f..b117cf04cd9962ef74a2d20eee12ad735e30dfe4 100644 (file)
@@ -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 <filepattern> 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
index 0ce774b27db2ca17164807d9810a3576c660c953..d27793c5beae25d9b222730a6fbabfa838ce83d9 100644 (file)
@@ -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();
index 139093a0801ce17c620818bacb6dc99aade6174f..0290689c819a2110081e22309201ffe1540efb6a 100644 (file)
@@ -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/";