aboutsummaryrefslogtreecommitdiffstats
path: root/org.eclipse.jgit/src/org/eclipse/jgit/hooks
diff options
context:
space:
mode:
authorLaurent Delaigue <laurent.delaigue@obeo.fr>2015-02-23 11:18:50 +0100
committerChristian Halstrick <christian.halstrick@sap.com>2015-03-02 15:33:30 +0100
commit26fd56f167e6377777e6d46c14779183e4bcb55a (patch)
tree1d852b5ff1a32930773aff6218c03b09e6e56245 /org.eclipse.jgit/src/org/eclipse/jgit/hooks
parent12a55c34753669365d9e644e592d9d8c10e742f1 (diff)
downloadjgit-26fd56f167e6377777e6d46c14779183e4bcb55a.tar.gz
jgit-26fd56f167e6377777e6d46c14779183e4bcb55a.zip
Refactored pre-commit hook to make it less invasive.
Hooks are now obtained via a convenient API like git commands, and callers don't have to check for their existence. The pre-commit hook has been updated accordingly. Change-Id: I3383ffb10e2f3b588d7367b9139b606ec7f62758 Signed-off-by: Laurent Delaigue <laurent.delaigue@obeo.fr> Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
Diffstat (limited to 'org.eclipse.jgit/src/org/eclipse/jgit/hooks')
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/hooks/GitHook.java159
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/hooks/Hooks.java66
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/hooks/PreCommitHook.java84
3 files changed, 309 insertions, 0 deletions
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/hooks/GitHook.java b/org.eclipse.jgit/src/org/eclipse/jgit/hooks/GitHook.java
new file mode 100644
index 0000000000..ad2eeb0205
--- /dev/null
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/hooks/GitHook.java
@@ -0,0 +1,159 @@
+/*
+ * Copyright (C) 2015 Obeo.
+ * and other copyright owners as documented in the project's IP log.
+ *
+ * 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
+ *
+ * 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.
+ */
+package org.eclipse.jgit.hooks;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.util.concurrent.Callable;
+
+import org.eclipse.jgit.api.errors.AbortedByHookException;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.util.FS;
+import org.eclipse.jgit.util.ProcessResult;
+
+/**
+ * Git can fire off custom scripts when certain important actions occur. These
+ * custom scripts are called "hooks". There are two groups of hooks: client-side
+ * (that run on local operations such as committing and merging), and
+ * server-side (that run on network operations such as receiving pushed
+ * commits). This is the abstract super-class of the different hook
+ * implementations in JGit.
+ *
+ * @param <T>
+ * the return type which is expected from {@link #call()}
+ * @see <a href="http://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks">Git
+ * Hooks on the git-scm official site</a>
+ * @since 4.0
+ */
+abstract class GitHook<T> implements Callable<T> {
+
+ private final Repository repo;
+
+ /**
+ * The output stream to be used by the hook.
+ */
+ protected final PrintStream outputStream;
+
+ /**
+ * @param repo
+ * @param outputStream
+ * The output stream the hook must use. {@code null} is allowed,
+ * in which case the hook will use {@code System.out}.
+ */
+ protected GitHook(Repository repo, PrintStream outputStream) {
+ this.repo = repo;
+ this.outputStream = outputStream;
+ }
+
+ /**
+ * Run the hook.
+ *
+ * @throws IOException
+ * if IO goes wrong.
+ * @throws AbortedByHookException
+ * If the hook has been run and a returned an exit code
+ * different from zero.
+ */
+ public abstract T call() throws IOException, AbortedByHookException;
+
+ /**
+ * @return The name of the hook, which must not be {@code null}.
+ */
+ public abstract String getHookName();
+
+ /**
+ * @return The repository.
+ */
+ protected Repository getRepository() {
+ return repo;
+ }
+
+ /**
+ * Override this method when needed to provide relevant parameters to the
+ * underlying hook script. The default implementation returns an empty
+ * array.
+ *
+ * @return The parameters the hook receives.
+ */
+ protected String[] getParameters() {
+ return new String[0];
+ }
+
+ /**
+ * Override to provide relevant arguments via stdin to the underlying hook
+ * script. The default implementation returns {@code null}.
+ *
+ * @return The parameters the hook receives.
+ */
+ protected String getStdinArgs() {
+ return null;
+ }
+
+ /**
+ * @return The output stream the hook must use. Never {@code null},
+ * {@code System.out} is returned by default.
+ */
+ protected PrintStream getOutputStream() {
+ return outputStream == null ? System.out : outputStream;
+ }
+
+ /**
+ * Runs the hook, without performing any validity checks.
+ *
+ * @throws AbortedByHookException
+ * If the underlying hook script exited with non-zero.
+ */
+ protected void doRun() throws AbortedByHookException {
+ final ByteArrayOutputStream errorByteArray = new ByteArrayOutputStream();
+ final PrintStream hookErrRedirect = new PrintStream(errorByteArray);
+ ProcessResult result = FS.DETECTED.runHookIfPresent(getRepository(),
+ getHookName(), getParameters(), getOutputStream(),
+ hookErrRedirect, getStdinArgs());
+ if (result.isExecutedWithError()) {
+ throw new AbortedByHookException(errorByteArray.toString(),
+ getHookName(), result.getExitCode());
+ }
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/hooks/Hooks.java b/org.eclipse.jgit/src/org/eclipse/jgit/hooks/Hooks.java
new file mode 100644
index 0000000000..a2e4fa5609
--- /dev/null
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/hooks/Hooks.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2015 Obeo.
+ * and other copyright owners as documented in the project's IP log.
+ *
+ * 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
+ *
+ * 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.
+ */
+package org.eclipse.jgit.hooks;
+
+import java.io.PrintStream;
+
+import org.eclipse.jgit.lib.Repository;
+
+/**
+ * Factory class for instantiating supported hooks.
+ *
+ * @since 4.0
+ */
+public class Hooks {
+
+ /**
+ * @param repo
+ * @param outputStream
+ * The output stream, or {@code null} to use {@code System.out}
+ * @return The pre-commit hook for the given repository.
+ */
+ public static PreCommitHook preCommit(Repository repo,
+ PrintStream outputStream) {
+ return new PreCommitHook(repo, outputStream);
+ }
+}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/hooks/PreCommitHook.java b/org.eclipse.jgit/src/org/eclipse/jgit/hooks/PreCommitHook.java
new file mode 100644
index 0000000000..1ab32e0c2b
--- /dev/null
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/hooks/PreCommitHook.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2015 Obeo.
+ * and other copyright owners as documented in the project's IP log.
+ *
+ * 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
+ *
+ * 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.
+ */
+package org.eclipse.jgit.hooks;
+
+import java.io.IOException;
+import java.io.PrintStream;
+
+import org.eclipse.jgit.api.errors.AbortedByHookException;
+import org.eclipse.jgit.lib.Repository;
+
+/**
+ * The <code>pre-commit</code> hook implementation. This hook is run before the
+ * commit and can reject the commit.
+ *
+ * @since 4.0
+ */
+public class PreCommitHook extends GitHook<Void> {
+
+ /** The pre-commit hook name. */
+ public static final String NAME = "pre-commit"; //$NON-NLS-1$
+
+ /**
+ * @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 PreCommitHook(Repository repo, PrintStream outputStream) {
+ super(repo, outputStream);
+ }
+
+ @Override
+ public Void call() throws IOException, AbortedByHookException {
+ doRun();
+ return null;
+ }
+
+ @Override
+ public String getHookName() {
+ return NAME;
+ }
+
+}