aboutsummaryrefslogtreecommitdiffstats
path: root/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Log.java
diff options
context:
space:
mode:
Diffstat (limited to 'org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Log.java')
-rw-r--r--org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Log.java141
1 files changed, 85 insertions, 56 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 d43424c7ce..958e566986 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
@@ -1,46 +1,13 @@
/*
* Copyright (C) 2010, Google Inc.
- * Copyright (C) 2006-2008, Robin Rosenberg <robin.rosenberg@dewire.com>
- * Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org>
- * and other copyright owners as documented in the project's IP log.
+ * Copyright (C) 2006, 2008, Robin Rosenberg <robin.rosenberg@dewire.com>
+ * Copyright (C) 2008, 2021, Shawn O. Pearce <spearce@spearce.org> and others
*
- * This program and the accompanying materials are made available
- * under the terms of the Eclipse Distribution License v1.0 which
- * accompanies this distribution, is reproduced below, and is
- * available at http://www.eclipse.org/org/documents/edl-v10.php
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Distribution License v. 1.0 which is available at
+ * https://www.eclipse.org/org/documents/edl-v10.php.
*
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or
- * without modification, are permitted provided that the following
- * conditions are met:
- *
- * - Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * - Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following
- * disclaimer in the documentation and/or other materials provided
- * with the distribution.
- *
- * - Neither the name of the Eclipse Foundation, Inc. nor the
- * names of its contributors may be used to endorse or promote
- * products derived from this software without specific prior
- * written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
- * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * SPDX-License-Identifier: BSD-3-Clause
*/
package org.eclipse.jgit.pgm;
@@ -53,6 +20,7 @@ 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;
@@ -63,12 +31,16 @@ 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.GpgConfig;
+import org.eclipse.jgit.lib.SignatureVerifier.SignatureVerification;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.PersonIdent;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.lib.SignatureVerifiers;
import org.eclipse.jgit.notes.NoteMap;
import org.eclipse.jgit.pgm.internal.CLIText;
+import org.eclipse.jgit.pgm.internal.VerificationUtils;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevTree;
import org.eclipse.jgit.util.GitDateFormatter;
@@ -87,23 +59,30 @@ class Log extends RevWalkTextBuiltin {
private Map<String, NoteMap> noteMaps;
+ private boolean showNameOnly = false;
+
+ private boolean showNameAndStatusOnly = false;
+
@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>();
+ private List<String> additionalNoteRefs = new ArrayList<>();
@Option(name = "--show-notes", usage = "usage_showNotes", metaVar = "metaVar_ref")
void addAdditionalNoteRef(String notesRef) {
additionalNoteRefs.add(notesRef);
}
+ @Option(name = "--show-signature", usage = "usage_showSignature")
+ private boolean showSignature;
+
@Option(name = "--date", usage = "usage_date")
void dateFormat(String date) {
- if (date.toLowerCase().equals(date))
- date = date.toUpperCase();
+ if (date.toLowerCase(Locale.ROOT).equals(date))
+ date = date.toUpperCase(Locale.ROOT);
dateFormatter = new GitDateFormatter(Format.valueOf(date));
}
@@ -123,7 +102,22 @@ class Log extends RevWalkTextBuiltin {
private Integer renameLimit;
@Option(name = "--name-status", usage = "usage_nameStatus")
- private boolean showNameAndStatusOnly;
+ void nameAndStatusOnly(boolean on) {
+ if (showNameOnly) {
+ throw new IllegalArgumentException(
+ CLIText.get().cannotUseNameStatusOnlyAndNameOnly);
+ }
+ showNameAndStatusOnly = on;
+ }
+
+ @Option(name = "--name-only", usage = "usage_nameOnly")
+ void nameOnly(boolean on) {
+ if (showNameAndStatusOnly) {
+ throw new IllegalArgumentException(
+ CLIText.get().cannotUseNameStatusOnlyAndNameOnly);
+ }
+ showNameOnly = on;
+ }
@Option(name = "--ignore-space-at-eol")
void ignoreSpaceAtEol(@SuppressWarnings("unused") boolean on) {
@@ -179,23 +173,27 @@ class Log extends RevWalkTextBuiltin {
// END -- Options shared with Diff
+ private GpgConfig config;
+
Log() {
dateFormatter = new GitDateFormatter(Format.DEFAULT);
}
@Override
- protected void init(final Repository repository, final String gitDir) {
+ protected void init(Repository repository, String gitDir) {
super.init(repository, gitDir);
diffFmt = new DiffFormatter(new BufferedOutputStream(outs));
}
@Override
- protected void run() throws Exception {
+ protected void run() {
+ config = new GpgConfig(db.getConfig());
diffFmt.setRepository(db);
try {
diffFmt.setPathFilter(pathFilter);
- if (detectRenames != null)
+ if (detectRenames != null) {
diffFmt.setDetectRenames(detectRenames.booleanValue());
+ }
if (renameLimit != null && diffFmt.isDetectRenames()) {
RenameDetector rd = diffFmt.getRenameDetector();
rd.setRenameLimit(renameLimit.intValue());
@@ -203,7 +201,7 @@ class Log extends RevWalkTextBuiltin {
if (!noStandardNotes || !additionalNoteRefs.isEmpty()) {
createWalk();
- noteMaps = new LinkedHashMap<String, NoteMap>();
+ noteMaps = new LinkedHashMap<>();
if (!noStandardNotes) {
addNoteMap(Constants.R_NOTES_COMMITS);
}
@@ -217,18 +215,20 @@ class Log extends RevWalkTextBuiltin {
}
}
- if (decorate)
+ if (decorate) {
allRefsByPeeledObjectId = getRepository()
.getAllRefsByPeeledObjectId();
-
+ }
super.run();
+ } catch (Exception e) {
+ throw die(e.getMessage(), e);
} finally {
diffFmt.close();
}
}
private void addNoteMap(String notesRef) throws IOException {
- Ref notes = db.getRef(notesRef);
+ Ref notes = db.exactRef(notesRef);
if (notes == null)
return;
RevCommit notesCommit = argWalk.parseCommit(notes.getObjectId());
@@ -237,7 +237,7 @@ class Log extends RevWalkTextBuiltin {
}
@Override
- protected void show(final RevCommit c) throws Exception {
+ protected void show(RevCommit c) throws Exception {
outw.print(CLIText.get().commitLabel);
outw.print(" "); //$NON-NLS-1$
c.getId().copyTo(outbuffer, outw);
@@ -255,6 +255,9 @@ class Log extends RevWalkTextBuiltin {
}
outw.println();
+ if (showSignature) {
+ showSignature(c);
+ }
final PersonIdent author = c.getAuthorIdent();
outw.println(MessageFormat.format(CLIText.get().authorInfo, author.getName(), author.getEmailAddress()));
outw.println(MessageFormat.format(CLIText.get().dateInfo,
@@ -262,7 +265,7 @@ class Log extends RevWalkTextBuiltin {
outw.println();
final String[] lines = c.getFullMessage().split("\n"); //$NON-NLS-1$
- for (final String s : lines) {
+ for (String s : lines) {
outw.print(" "); //$NON-NLS-1$
outw.print(s);
outw.println();
@@ -273,16 +276,35 @@ class Log extends RevWalkTextBuiltin {
if (showNotes(c))
outw.println();
- if (c.getParentCount() <= 1 && (showNameAndStatusOnly || showPatch))
+ if (c.getParentCount() <= 1 && (showNameAndStatusOnly || showPatch
+ || showNameOnly)) {
showDiff(c);
+ }
outw.flush();
}
+ private void showSignature(RevCommit c) throws IOException {
+ if (c.getRawGpgSignature() == null) {
+ return;
+ }
+ SignatureVerification verification = SignatureVerifiers.verify(db,
+ config, c);
+ if (verification == null) {
+ return;
+ }
+ VerificationUtils.writeVerification(outw, verification,
+ verification.verifierName(), c.getCommitterIdent());
+ }
+
/**
+ * Show notes for given commit
+ *
* @param c
+ * given commit
* @return <code>true</code> if at least one note was printed,
* <code>false</code> otherwise
* @throws IOException
+ * if an IO error occurred
*/
private boolean showNotes(RevCommit c) throws IOException {
if (noteMaps == null)
@@ -309,12 +331,17 @@ class Log extends RevWalkTextBuiltin {
/**
* @param c
+ * given commit
* @param map
+ * note map
* @param label
+ * label
* @param emptyLine
+ * whether to start with an empty line
* @return <code>true</code> if note was printed, <code>false</code>
* otherwise
* @throws IOException
+ * if an IO error occurred
*/
private boolean showNotes(RevCommit c, NoteMap map, String label,
boolean emptyLine)
@@ -324,7 +351,7 @@ class Log extends RevWalkTextBuiltin {
return false;
if (emptyLine)
outw.println();
- outw.print("Notes");
+ outw.print("Notes"); //$NON-NLS-1$
if (label != null) {
outw.print(" ("); //$NON-NLS-1$
outw.print(label);
@@ -350,9 +377,11 @@ class Log extends RevWalkTextBuiltin {
: null;
final RevTree b = c.getTree();
- if (showNameAndStatusOnly)
+ if (showNameAndStatusOnly) {
Diff.nameStatus(outw, diffFmt.scan(a, b));
- else {
+ } else if (showNameOnly) {
+ Diff.nameOnly(outw, diffFmt.scan(a, b));
+ } else {
outw.flush();
diffFmt.format(a, b);
diffFmt.flush();