summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--org.eclipse.jgit.pgm/META-INF/MANIFEST.MF1
-rw-r--r--org.eclipse.jgit.pgm/resources/org/eclipse/jgit/pgm/CLIText.properties3
-rw-r--r--org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Log.java120
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/lib/Constants.java6
4 files changed, 130 insertions, 0 deletions
diff --git a/org.eclipse.jgit.pgm/META-INF/MANIFEST.MF b/org.eclipse.jgit.pgm/META-INF/MANIFEST.MF
index f27bcf5fd9..9825031ce2 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 c1b5c53443..b117cf04cd 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 <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
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();
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 139093a080..0290689c81 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/";