1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
|
/*
* 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);
}
@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;
}
@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;
}
}
|