CommitMsgHook.java
- /*
- * Copyright (C) 2015 Obeo. and others
- *
- * 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.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
- package org.eclipse.jgit.hooks;
- import java.io.File;
- import java.io.IOException;
- import java.io.PrintStream;
- import org.eclipse.jgit.api.errors.AbortedByHookException;
- import org.eclipse.jgit.lib.Constants;
- import org.eclipse.jgit.lib.Repository;
- /**
- * The <code>commit-msg</code> hook implementation. This hook is run before the
- * commit and can reject the commit. It passes one argument to the hook script,
- * which is the path to the COMMIT_MSG file, relative to the repository
- * workTree.
- *
- * @since 4.0
- */
- public class CommitMsgHook extends GitHook<String> {
- /**
- * Constant indicating the name of the commit-smg hook.
- */
- public static final String NAME = "commit-msg"; //$NON-NLS-1$
- /**
- * The commit message.
- */
- private String commitMessage;
- /**
- * Constructor for CommitMsgHook
- * <p>
- * This constructor will use the default error stream.
- * </p>
- *
- * @param repo
- * The repository
- * @param outputStream
- * The output stream the hook must use. {@code null} is allowed,
- * in which case the hook will use {@code System.out}.
- */
- protected CommitMsgHook(Repository repo, PrintStream outputStream) {
- super(repo, outputStream);
- }
- /**
- * Constructor for CommitMsgHook
- *
- * @param repo
- * The repository
- * @param outputStream
- * The output stream the hook must use. {@code null} is allowed,
- * in which case the hook will use {@code System.out}.
- * @param errorStream
- * The error stream the hook must use. {@code null} is allowed,
- * in which case the hook will use {@code System.err}.
- * @since 5.6
- */
- protected CommitMsgHook(Repository repo, PrintStream outputStream,
- PrintStream errorStream) {
- super(repo, outputStream, errorStream);
- }
- /** {@inheritDoc} */
- @Override
- public String call() throws IOException, AbortedByHookException {
- if (commitMessage == null) {
- throw new IllegalStateException();
- }
- if (canRun()) {
- getRepository().writeCommitEditMsg(commitMessage);
- doRun();
- commitMessage = getRepository().readCommitEditMsg();
- }
- return commitMessage;
- }
- /**
- * @return {@code true} if and only if the path to the message commit file
- * is not null (which would happen in a bare repository) and the
- * commit message is also not null.
- */
- private boolean canRun() {
- return getCommitEditMessageFilePath() != null && commitMessage != null;
- }
- /** {@inheritDoc} */
- @Override
- public String getHookName() {
- return NAME;
- }
- /**
- * {@inheritDoc}
- *
- * This hook receives one parameter, which is the path to the file holding
- * the current commit-msg, relative to the repository's work tree.
- */
- @Override
- protected String[] getParameters() {
- return new String[] { getCommitEditMessageFilePath() };
- }
- /**
- * @return The path to the commit edit message file relative to the
- * repository's work tree, or null if the repository is bare.
- */
- private String getCommitEditMessageFilePath() {
- File gitDir = getRepository().getDirectory();
- if (gitDir == null) {
- return null;
- }
- return Repository.stripWorkDir(getRepository().getWorkTree(), new File(
- gitDir, Constants.COMMIT_EDITMSG));
- }
- /**
- * It is mandatory to call this method with a non-null value before actually
- * calling the hook.
- *
- * @param commitMessage
- * The commit message before the hook has run.
- * @return {@code this} for convenience.
- */
- public CommitMsgHook setCommitMessage(String commitMessage) {
- this.commitMessage = commitMessage;
- return this;
- }
- }